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
我希望检索它的行之一!
如果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 的全部内容读入内存,但是如果它很大,这应该只是一个问题,在这种情况下,您无论如何都希望优化,因为比较的乘法性质。