grep, awk, sed, 在 file1 和 file2 column3 中打印第 2 列匹配

kap*_*001 4 grep sed awk text-processing

编辑:我想将 file1.txt 的第 1,2 列与 file2.txt 的第 1,3 列匹配并打印 file2.txt 的匹配行

文件1.txt:

scaffold1   57482
scaffold1   63114
scaffold1   63118
scaffold1   63129
scaffold1   63139
scaffold1   63279
scaffold1   63294
scaffold2   65015
scaffold2   77268
scaffold2   77335
Run Code Online (Sandbox Code Playgroud)

文件2.txt:

scaffold1   381 382 T/A +
scaffold1   384 385 T/A,G   +
scaffold1   385 386 G/C +
scaffold1   445 446 C/T +
scaffold1   57481   57482   T/A +
scaffold1   63113   63114   T/A,G   +
scaffold1   63128   63129   G/C +
scaffold2   65014   65015   G/A +
scaffold2   77267   77268   G/A +
scaffold2   77334   77335   C/T +
Run Code Online (Sandbox Code Playgroud)

输出.txt:

scaffold1   57481   57482   T/A +
scaffold1   63113   63114   T/A,G   +
scaffold1   63128   63129   G/C +
scaffold2   65014   65015   G/A +
scaffold2   77267   77268   G/A +
scaffold2   77334   77335   C/T +
Run Code Online (Sandbox Code Playgroud)

ter*_*don 9

一个awk解决方案:

$ awk 'NR==FNR{a[$1$2]++;next}{if($1$3 in a){print}}' file1 file2 
scaffold1   57481   57482   T/A +
scaffold1   63113   63114   T/A,G   +
scaffold1   63128   63129   G/C +
scaffold2   65014   65015   G/A +
scaffold2   77267   77268   G/A +
scaffold2   77334   77335   C/T +
Run Code Online (Sandbox Code Playgroud)

NR是当前行号和FNR当前文件的当前行号。只有在读取第一个文件时,两者才相等。所以第一个块只会在读取第一个文件时执行,因此第一个文件的第一个和第二个字段保存在数组中a。然后,当处理第二个文件时,我们仅在第一个和第三个字段存在于 中时才打印其行a,因此仅当它存在于第一个文件中时。