【问题标题】:Match multiple fields between 2 files with AWK and display specific fields使用 AWK 匹配 2 个文件之间的多个字段并显示特定字段
【发布时间】:2019-11-29 16:52:19
【问题描述】:

我有 2 个文件,如下所示: 文件1.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 的 A-D 列的数值。选择什么列提取应取决于 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

【问题讨论】:

  • 为什么预期输出的第二行是chr1 2488105 C 0.053 0而不是chr1 2488105 C 0.053 99.954
  • 你完全正确!我看错了专栏的标题!

标签: arrays awk pattern-matching


【解决方案1】:

它与您发布的预期输出不匹配,但它与您的问题描述的一样,所以我认为这可能是您真正想要的:

$ 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

【讨论】:

  • 这就是我要找的!非常感谢莫顿先生
  • 不,无论问题是什么,它都与您的文件包含多少行或列无关。您必须对输入文件使用分而治之或类似的方法来查明问题,但首先检查您是否有 DOS 行结尾,因为这通常是非明显错误的罪魁祸首,请参阅stackoverflow.com/q/45772525/1745001。不,抱歉,我不想获取您的文件副本来调试它。
  • 文件格式出错。再次感谢您的帮助!
猜你喜欢
  • 2016-12-09
  • 1970-01-01
  • 2011-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-21
  • 1970-01-01
相关资源
最近更新 更多