grep使用其他文件中的单词匹配行中的特定位置

时间:2015-07-10 04:33:46

标签: shell unix grep

我有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.*

但没有用。

3 个答案:

答案 0 :(得分:3)

使用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行。

  • 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。

答案 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

最方便的方法是将每个替代项放在文件的单独一行中。

您可以看一下这个问题:

grep multiple patterns single file argument list too long

相关问题