AWK比较两个文件中的两列输出匹配行 - 匹配中缺少的行

时间:2018-05-15 19:59:45

标签: linux bash awk

我有两个txt文件(制表符分隔)我试图与awk进行比较。我想将file1的第1列与file2的第5列进行比较,并且任何时候file1第1列的字符串与file2第5列匹配我想要打印(最终到新的txt文件)整行file2。文件1中大约有14000行,只有一列,40000行,文件2中有6列。下面是我用来试图弄清楚如何使用awk获取所需输出的一些测试文件。

文件1

AAGAB
AAK1
AAMDC
AAMP
AAR2
AARD
AARS

file2的

chr22   38035683    38052050    NM_018957   AAMDC   +
chrX    47001614    47004609    NM_019056   AAMP    -
chr9    21994789    22077889    NR_047539   AAR2    +
chr16   20370491    20416033    NM_174924   AARD    -
chr1    210111518   210337633   NM_001146262    AARS    +
chrX    30233674    30238206    NM_002364   MAGEB2  +
chrX    30261847    30270155    NM_002363   MAGEB1  +

我已尝试采用其他类似awk问题的类似所需输出的其他awk问题:

awk -F '\t' 'NR==FNR{c[$1]++;next}c[$5]' file1 file2

但是我只为AARS行获得一个匹配项,即使测试文件中还有其他匹配项:

chr1    210111518   210337633   NM_001146262    AARS    +

我正在寻找的输出是:

chr14   94463615    94473898    NR_024182   AAGAB   +
chr10   74033676    74035797    NM_019058   AAK1    +
chr22   38035683    38052050    NM_018957   AAMDC   +
chrX    47001614    47004609    NM_019056   AAMP    -
chr9    21994789    22077889    NR_047539   AAR2    +
chr16   20370491    20416033    NM_174924   AARD    -
chr1    210111518   210337633   NM_001146262    AARS    +

我已尝试在stackoverflow上使用其他几个帖子,但即使存在多个其他匹配项,仍然只获得1个匹配的相同输出:

awk to match file1 with file2 and output matches

awk -F '\t' 'NR==FNR{c[$1]; next} ($5 in c)' file1 file2

Find rows with the same value in a column in two files

awk -F '\t' 'NR==FNR{A[$1];next}$5 in A' file1 file2

Comparing two columns in two files using awk

awk -F '\t' 'FNR==NR {a[$1];next} {for (i in a) if ($5~i) print}' file1 file2

有人可以帮我理解我的awk系列出错的地方吗?

我目前正在使用GNU Awk 4.2.1,API:2.0

2 个答案:

答案 0 :(得分:0)

我觉得你差不多了......我确实检查了 - 以下内容适用于我。

awk -F '\t' 'BEGIN { split("", a) } NR == FNR { a[$0] = 1; next } $5 in a' file1 file2

结果(示例中的输出与file2不一致):

chr22   38035683    38052050    NM_018957   AAMDC   +
chrX    47001614    47004609    NM_019056   AAMP    -
chr9    21994789    22077889    NR_047539   AAR2    +
chr16   20370491    20416033    NM_174924   AARD    -
chr1    210111518   210337633   NM_001146262    AARS    +

FS有可能出现问题,我想......你可以尝试在空间和标签上点击FS。还试图从混乱中删除任何不可见和不可打印的字符?

awk -F '[[:blank:]]+' '
    BEGIN { split("", a) }
    NR == FNR {
        gsub(/[^[:graph:]]/, "")
        a[$0] = 1
        next
    }
    {
        p = $5
        gsub(/[^[:graph:]]/, "", p)
    }
    p in a' file1 file2

答案 1 :(得分:0)

file1读入一个关联数组。然后阅读file2,并为每一行寻找匹配项。

$ awk 'BEGIN{while(getline line<"file1") {x[line]="1";}} {for (i=1;i<=NF;i++) if(x[$i]) {print; break} }' file2
chr22   38035683    38052050    NM_018957   AAMDC   +
chrX    47001614    47004609    NM_019056   AAMP    -
chr9    21994789    22077889    NR_047539   AAR2    +
chr16   20370491    20416033    NM_174924   AARD    -
chr1    210111518   210337633   NM_001146262    AARS    +