比较不同文件的多列并在匹配时附加文件中的一列

Comparing multiple columns of different files and appending a column from a file if there is a match

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

的第 1 列

预期输出:

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 的第 2 列和第 3 列以及 1.txt 的第 7 列和第 8 列),如果匹配,我可以打印一个字符串。但是我无法打印第一个文件的第一列。 我的代码:

awk -F, 'NR==FNR {a[ FS ];next} {print [=13=] FS (( FS ) 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?

对应的第 1 列

以下 awk 可能会对您有所帮助。

awk 'FNR==NR{a[,,,]=[=10=];next} {printf("%s%s\n",[=10=],((,,,) 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

同样在这里添加解释。

awk '
FNR==NR{  ##Mentioning FNR==NR condition which will be TRUE only when first Input_file named 2.txt is being read.
  a[,,,]=[=12=]; ##creating an array named a whose indexes are 2nd 3rd 4th and 5th field and value is current line value.
  next               ##next is awk default keyword which will skip all further statements.
}
{
  printf("%s%s\n",[=12=],((,,,) in a)?" exists":" none") ##Printing current line and a conditional statement result here, if ,,, are present in array a then print string exists in last of line or print none.
}' 2.txt 1.txt                                                ##Mentioning the Input_file names here.

awk 方法:

awk 'NR==FNR{ a[,,,]=; next }
     { s=SUBSEP; k= s  s  s  }k in a{ print [=10=],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