我在 awk 中访问文件的列时遇到问题。 我有两个文件,一个有 12 列,另一个有 5 列。
1.txt
chr1 10 20 . . + chr1 30 40 ABC . +
chr2 11 22 . . + chr2 90 92 XXX . -
chrX 33 42 . . + chrX 70 80 XXX . +
chr4 3 12 . . + chr4 70 80 ZZZ . +
并且,
2.txt
1 chr1 30 40 ABC
3 chr1 35 40 ABC
27 chr2 90 92 XXX
1 chrX 70 80 XXX
2 chrY 12 13 XXX
我想比较2.txt
的第2、3、4、5列与 1.txt.
的第 7、8、9、10 个如果有匹配,它应该打印整行 1.txt
,以及 2.txt.
的第一列
预期输出:
chr1 10 20 . . + chr1 30 40 ABC . + 1
chr2 11 22 . . + chr2 90 92 XXX . - 27
chrX 33 42 . . + chrX 70 80 XXX . + 1
由于我无法比较 4 列,所以我用两列进行了比较。而且,我可以比较每一列的两列( 2.txt
的第二列和第三列以及 1.txt
的第七列和第八列),如果存在匹配,我可以打印一个字符串。但我无法打印第一个文件的第一列。
我的代码:
awk -F, 'NR==FNR {a[$2 FS $3];next} {print $0 FS (($7 FS $8) in a?"exists":"none")}' 2.txt 1.txt
它会产生什么(我不想要):
chr1 10 20 . . + chr1 30 40 ABC . + exists
chr2 11 22 . . + chr2 90 92 XXX . - exists
chrX 33 42 . . + chrX 70 80 XXX . + exists
chr4 3 12 . . + chr4 70 80 ZZZ . + none
如何将这个新的第 13 列更改为 1.txt?
的相应第一列
最佳答案
awk方法:
awk 'NR==FNR{ a[$2,$3,$4,$5]=$1; next }
{ s=SUBSEP; k=$7 s $8 s $9 s $10 }k in a{ print $0,a[k] }' 2.txt 1.txt
输出:
chr1 10 20 . . + chr1 30 40 ABC . + 1
chr2 11 22 . . + chr2 90 92 XXX . - 27
chrX 33 42 . . + chrX 70 80 XXX . + 1
关于awk - 比较不同文件的多列,如果匹配则附加文件中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47393727/