Grep 特定字段上的文件

Lin*_*ket 6 command-line grep text-processing

我有两个文件,让我们说

文件1:

Locus_1
Locus_2
Locus_3
Run Code Online (Sandbox Code Playgroud)

文件2:

3  3  Locus_1  Locus_40  etc_849    
3  2  Locus_2  Locus_94  *    
2  2  Locus_6  Locus_1  *    
2  3  Locus_3,Locus_4  Locus_50  *    
3  3  Locus_9  Locus_3  etc_667
Run Code Online (Sandbox Code Playgroud)

我想要做一个grep -F为所述第一文件在所述第二文件的第三列(在原始File2字段由制表符是分开的),如输出应为:

输出:

3  3  Locus_1  Locus_40  etc_849    
3  2  Locus_2  Locus_94  *    
2  3  Locus_3,Locus_4  Locus_50  *
Run Code Online (Sandbox Code Playgroud)

我该怎么做?

Edit To Chaos:不,逗号不是错误。我可以在一列中包含多个 Locus_* - 万一第二个 Locus_*(逗号后面的那个)也匹配File1我希望检索它的行之一!

cha*_*aos 5

如果grep没有必要,一个简单的解决方案是使用join

$ join -1 1 -2 3 <(sort file1) <(sort -k3 file2)
Locus_1 3 3 Locus_40 etc_849
Locus_2 3 2 Locus_94 *
Locus_3 2 3 Locus_4 Locus_50 *
Run Code Online (Sandbox Code Playgroud)

说明

  • join -1 1 -2 3: 连接两个文件,其中第一个文件使用第一个(也是唯一一个)字段,第二个文件使用第三个字段。当它们相等时打印它们。
  • <(sort file1): join需要排序输入
  • <(sort -k3 file2):输入必须在连接字段上排序(此处为第三个字段)


小智 5

/sf/answers/695606901/调整解决方案,您可以使用 (g)awk 获得:

awk 'NR==FNR{a[$0]=1;next} {for(i in a){if($3~i){print;break}}}' File1 File2

它提供给定的输出。

虽然您可以制作一个 RegEx 来输入 grep 以满足仅在第三列上的匹配,但我觉得在这一点上使用 awk 更容易理解。

if($3~i){print;break}仅当第三列与 File1 中的一行(存储在数组 a 中)匹配时,该部件才负责打印。有关其余部分的解释,请参阅链接的帖子。

请注意,这会将 File1 的全部内容读入内存,但是如果它很大,这应该只是一个问题,在这种情况下,您无论如何都希望优化,因为比较的乘法性质。