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)
一个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
,因此仅当它存在于第一个文件中时。