比较不同文件的多列并在匹配时附加文件中的一列
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
我在 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
的第 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?
以下 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