Awk 比较不同文件的多列,如果存在匹配项,则从文件中追加一列

Awk 比较不同文件的多列,如果存在匹配项,则从文件中追加一列,awk,multiple-columns,string-comparison,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的第2、第3、第4和第5列与1.txt的第7、第8、第9、第10列进行比较。如果有匹配项,它应该打印

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

它的制作(我不想要):


如何将新的第13列更改为
1.txt的相应第1列?

下面的
awk
可能会对您有所帮助

awk 'FNR==NR{a[$2,$3,$4,$5]=$0;next} {printf("%s%s\n",$0,(($7,$8,$9,$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[$2,$3,$4,$5]=$0; ##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",$0,(($7,$8,$9,$10) in a)?" exists":" none") ##Printing current line and a conditional statement result here, if $7,$8,$9,$10 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[$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

然而,我预期的第13行是“2.txt”中对应的第1列,如:“chr1 10 20..+chr1 30 40 ABC+1 chr2 11 22..+CHR29092xxx.-27 chrX 33 42..+chrX 70 80 XXX+1'@bapors,我在这里也添加了我代码的解释,预期输出与您现在显示的相同。它工作正常,谢谢!您能否解释一下如何将第一列添加为第13列?@bapors,welcome,
print$0,a[k]
将从文件
1.txt
(12个字段)中打印整行
$0
,并从
a[k]
中获取
2.txt
中的第一个字段,如果我们想在没有匹配项的情况下保留1.txt的整行内容,我们该怎么做?
awk '
FNR==NR{  ##Mentioning FNR==NR condition which will be TRUE only when first Input_file named 2.txt is being read.
  a[$2,$3,$4,$5]=$0; ##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",$0,(($7,$8,$9,$10) in a)?" exists":" none") ##Printing current line and a conditional statement result here, if $7,$8,$9,$10 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 '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