[英]Match multiple fields between 2 files with AWK and display specific fields
我有2個文件,如下所示:file1.txt
chr pos ref totoal A C T G
chr1 2488104 A 8690 99.954 0.0230 0 0.0230
chr1 2488105 T 8847 0 99.954 0.022 0.0226
chr1 2488106 G 8902 0.011 0.0337 0 99.955
chr1 2488107 G 8875 0 0.02252 0 99.977
chr1 2488108 A 8674 99.919 0 0.011 0.0691
chr1 2488109 G 9116 0.021 0.0658 0 99.912
chr1 2488110 C 9191 0.087 0.0652 99.847 0
chr1 2488111 C 9291 0 0.0430 99.956 0
chr1 2488112 T 9254 0 100 0 0
chr1 2488113 C 9354 0 0.0427 99.957 0
chr1 2488114 C 9493 0 0.0842 99.915 0
和file2.txt:
chr1 2488111 T 0.09
chr1 2488105 C 0.053
chr1 2488115 G 0.03
如果$ 1和$ 2在兩個文件之間匹配,我想提取file1列AD的數值。 列提取內容的選擇應取決於file2的$ 3字段(即“ chr1 2488111 T”,我將返回“ 99.956”,因為它是列“ T”中chr1位置2488111的報告值)。
我找到了一堆代碼來匹配兩個文件之間的字段,但是我不能只收回自己感興趣的值。 AWK是以下內容:
awk '
BEGIN {FS = OFS = "\t"
}
NR==FNR {for (n = split ($2, a); n>0; n--) CMP[$1, a[n]]
next
}($1,$2) in CMP {print $0
}
' file2.txt file1.txt
我想返回一個基於字段之間的匹配以及file2的$ 3和file1的標頭之間的匹配從file1中提取的單個值。
理想的輸出是報告file2的原始行,並在該行的末尾附加值:
chr1 2488111 T 0.09 99.956
chr1 2488105 C 0.053 0
chr1 2488115 G 0.03 NA
它與您發布的預期輸出不匹配,但是確實滿足您的問題描述,因此我認為這可能正是您真正想要的:
$ cat tst.awk
BEGIN { FS=OFS="\t" }
NR==FNR {
if (NR == 1) {
for (i=1; i<=NF; i++) {
fldNr2name[i] = $i
}
next
}
for (fldNr=3; fldNr<=NF; fldNr++) {
fldName = fldNr2name[fldNr]
vals[$1,$2,fldName] = $fldNr
}
next
}
{
print $0, ( ($1,$2,$3) in vals ? vals[$1,$2,$3] : "NA" )
}
$ awk -f tst.awk file1 file2
chr1 2488111 T 0.09 99.956
chr1 2488105 C 0.053 99.954
chr1 2488115 G 0.03 NA
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.