Shell grep使用其他文件中的单词匹配行中的特定位置
我有两个文件 文件1:Shell grep使用其他文件中的单词匹配行中的特定位置,shell,unix,grep,Shell,Unix,Grep,我有两个文件 文件1: 12342015010198765hello 12342015010188765hello 12342015010178765hello 其每行包含固定位置的字段,例如,位置13-17表示account\u id 文件2: 98765 88765 其中包含帐户id的列表 在Korn Shell中,我想打印文件1中位置13-17与文件2中的account\u id之一匹配的行。 我做不到 grep -f file2 file1 因为file2中的account\u i
12342015010198765hello
12342015010188765hello
12342015010178765hello
其每行包含固定位置的字段,例如,位置13-17
表示account\u id
文件2:
98765
88765
其中包含帐户id的列表
在Korn Shell中,我想打印文件1中位置13-17
与文件2中的account\u id
之一匹配的行。
我做不到
grep -f file2 file1
因为file2中的account\u id
可以匹配其他位置的其他字段
我已尝试在文件2中使用模式:
^.{12}98765.*
但不起作用。使用awk
工作原理
FNR是到目前为止从当前文件读取的行数,NR是到目前为止读取的行总数。因此,如果NR==FNR{a[$1]=1;next;}
,我们将读取第一个文件,即FNR==NR
文件2中的每个ID都保存在数组file2
中。然后,我们跳过其余的命令,跳转到下一行a
如果我们达到这个命令,我们正在处理第二个文件,a中的substr($0,13,5)
如果从位置13开始的5个字符长的子字符串位于数组file1
中,则此条件为真。如果条件为true,则awk执行默认操作,即打印该行a
grep '^.{12}98765.*' file2
它使用扩展的正则表达式语法,这意味着需要-E
。此外,在结尾处匹配*
没有任何价值:它将始终匹配。因此,请尝试:
$ grep -E '^.{12}98765' file1
12342015010198765hello
要获得这两行,请执行以下操作:
$ grep -E '^.{12}[89]8765' file1
12342015010198765hello
12342015010188765hello
这是因为
[89]8765
恰好与文件2中感兴趣的ID匹配。当然,awk解决方案在匹配哪些ID方面提供了更大的灵活性。使用扩展正则表达式的sed
:
sed -r 's@.*@/^.{12}&/p@' file2 |sed -nr -f- file1
使用基本正则表达式:
sed 's@.*@/^.\\{12\\}&/p@' file1 |sed -n -f- file
说明:
sed -r 's@.*@/^.{12}&/p@' file2
将生成一个输出:
/.{12}98765/p
/.{12}88765/p
然后用作管道后下一个sed
脚本,该脚本输出:
12342015010198765hello
12342015010188765hello
使用Grep 最方便的方法是将每个备选方案放在文件的单独一行中 你可以看看这个问题:
12342015010198765hello
12342015010188765hello