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

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

我有两个文件

文件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 id
可以匹配其他位置的其他字段

我已尝试在文件2中使用模式:

^.{12}98765.*
但不起作用。

使用awk 工作原理
  • NR==FNR{a[$1]=1;next;}

    FNR是到目前为止从当前文件读取的行数,NR是到目前为止读取的行总数。因此,如果
    FNR==NR
    ,我们将读取第一个文件,即
    file2

    文件2中的每个ID都保存在数组
    a
    中。然后,我们跳过其余的命令,跳转到下一行

  • a中的substr($0,13,5)

    如果我们达到这个命令,我们正在处理第二个文件,
    file1

    如果从位置13开始的5个字符长的子字符串位于数组
    a
    中,则此条件为真。如果条件为true,则awk执行默认操作,即打印该行

使用grep 你提到尝试

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