gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 11:20:55 29 4
gpt4 key购买 nike

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

文件1

AAGAB
AAK1
AAMDC
AAMP
AAR2
AARD
AARS

文件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 +
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

但我只得到了 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 上的其他几篇文章,但即使存在多个其他匹配项,也只会获得相同的输出:

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

最佳答案

我想你几乎已经成功了……我确实检查过——下面的内容对我有用。

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

关于linux - AWK 比较两个文件输出匹配行中的两列 - 匹配中缺少行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50358313/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com