我有2个文件
文件1:
12342015010198765hello
12342015010188765hello
12342015010178765hello
其中每一行都包含固定位置的字段,例如,13 - 17
位置account_id
file2的:
98765
88765
包含account_id
s。
在Korn Shell中,我想打印file1中的行,其位置13 - 17
与file2中的account_id
匹配。
我无法做到
grep -f file2 file1
因为file2中的account_id
可以匹配其他位置的其他字段。
我尝试在file2中使用模式:
^.{12}98765.*
但没有用。
答案 0 :(得分:3)
$ 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
行。
substr($0,13,5) in a
如果我们到达此命令,我们正在处理第二个文件file1
。
如果从位置13开始的5个字符长子字符串在数组a
中,则此条件为真。如果条件为真,则awk执行默认操作,即打印该行。
你提到过尝试
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。
答案 1 :(得分:1)
将sed
与扩展的正则表达式一起使用:
sed -r 's@.*@/^.{12}&/p@' file2 |sed -nr -f- file1
使用Basic regex:
sed 's@.*@/^.\\{12\\}&/p@' file1 |sed -n -f- file
说明:
sed -r 's@.*@/^.{12}&/p@' file2
将生成输出:
/.{12}98765/p
/.{12}88765/p
然后用作管道下一个sed
的{{1}}脚本,输出:
sed
答案 2 :(得分:0)
使用Grep
最方便的方法是将每个替代项放在文件的单独一行中。
您可以看一下这个问题: