我有2个文件
file1:
12342015010198765hello
12342015010188765hello
12342015010178765hello
每行包含固定位置的字段,例如position13 - 17
is for account_id
file2:
98765
88765
其中包含一个列表account_id
s.
在科恩壳牌中,我想打印 file1 中位置的行13 - 17
匹配其中之一account_id
在文件2中。
我做不到
grep -f file2 file1
because account_id
file2 中的内容可以匹配其他位置的其他字段。
我尝试过在 file2 中使用模式:
^.{12}98765.*
但没有用。
使用 awk
$ awk 'NR==FNR{a[$1]=1;next;} substr($0,13,5) in a' file2 file1
12342015010198765hello
12342015010188765hello
怎么运行的
-
NR==FNR{a[$1]=1;next;}
FNR 是迄今为止从当前文件读取的行数,NR 是迄今为止读取的总行数。因此,如果FNR==NR
,我们正在读取第一个文件,它是file2
.
file2中的每个ID都保存在数组中a
。然后,我们跳过其余命令并跳转到next
line.
-
substr($0,13,5) in a
如果我们到达这个命令,我们正在处理第二个文件,file1
.
如果从位置 13 开始的 5 个字符长的子字符串在数组中,则此条件为真a
。如果条件为真,则 awk 执行默认操作,即打印该行。
使用 grep
你提到尝试
grep '^.{12}98765.*' file2
这使用扩展的正则表达式语法,这意味着-E
是必须的。而且,匹配没有任何价值.*
最后:它总是匹配的。因此,尝试:
$ grep -E '^.{12}98765' file1
12342015010198765hello
要获得两条线:
$ grep -E '^.{12}[89]8765' file1
12342015010198765hello
12342015010188765hello
这有效是因为[89]8765
恰好与 file2 中感兴趣的 ID 匹配。当然,awk 解决方案在匹配 ID 方面提供了更大的灵活性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)