awk - 比较不同文件的多列,如果匹配则附加文件中的列

标签 awk multiple-columns string-comparison

我在 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/

相关文章:

regex - 如何删除当前行中的最后一个单词,但前提是下一行出现模式?

mysql - 为什么 MySQL 多列索引会过载?

php - mysql在单个表的where条件下的多行值

linux - 读取变量并搜索 if 和 then 语句以匹配变量中的某些内容

php - 如何从数组中获取所有最接近的匹配字符串?

perl - 需要解析这个 dumpsys 输出(最好使用 Perl)

bash - 在 shell 脚本中解析文本文件

regex - 如何在正则表达式中提取两个单独的组?

Excel(平均值,标准偏差,...) - 每 N 列都有值

python - 比较不同数据类型的问题