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

332nm8kg  于 2023-10-16  发布在  Linux
关注(0)|答案(5)|浏览(123)

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

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  +

我试着从SO上大量类似的awk问题中采用一些具有类似期望输出的其他awk问题:

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

但是我只得到阿尔斯行的一个匹配,尽管测试文件中还有其他匹配:

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

cotxawn7

cotxawn71#

我觉得你差点就成功了...我做了检查--下面的工作对我来说。

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

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

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同时命中空格和制表符,并尝试从混乱中删除任何不可见和不可打印的字符?

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

2skhul332#

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    +
qxgroojn

qxgroojn3#

我将您的示例内容复制到“file1”和“file2”中,并将以下内容写入“script.awk”

BEGIN{
    while(getline < "file1") {
        a[$1]=1
    }
    close("file1")
} 
{
    if($5 in a){
        print
    }
}

运行

gawk -f script.awk 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    +

在我的理解中,这是正确的。请检查一下。

gstyhher

gstyhher4#

检查您的文件是否有您期望的文件夹。
我复制/粘贴您的数据,并获得成功,

awk 'NR==FNR{hit[$1];next} $5 in hit' file1 file2

但没有一个

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

我打开文件,用制表符替换所有连续的空格,然后再次运行它,两者都是一样的。
有时候,太多的细节会适得其反。

t98cgbkg

t98cgbkg5#

如果您的文件可能不是以制表符分隔的,那么您可以使用sed将空格和制表符替换为单个制表符。这假设数据中没有空格:

sed -i .bak 's/[[:space:]][[:space:]]*/\t/g' file

一旦你有了这个命令,你可以使用Unix join命令:

join -t $'\t' -1 1 -2 5 -o "2.1 2.2 2.3 2.4 2.5 2.6" <(sort file_1) <(sort -k5,5 file_2)

需要在连接字段中对文件进行排序。如果已按该字段排序,则不需要排序。
或者,这个awk工作:

awk -F '\t' 'FNR==NR{tag[$1]; next} $5 in tag' file_1 file_2

Join的优点是可以处理比内存大的文件。awk不需要排序,如果你有足够的内存,它可能会更快。
或者(使用您的两个输入示例)打印:

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    +

相关问题