【问题标题】:compare single column of two files line by line逐行比较两个文件的单列
【发布时间】:2015-04-03 01:09:35
【问题描述】:

我之前曾问过与此类似的问题,但没有找到我正在寻找的确切答案,对于冗余,我深表歉意。我决定重新发布措辞不同的问题。我有两个冗长的文件,每个文件都有两列,用空格隔开。

我想消除 fileA 和 fileB 中第 2 列匹配的所有行(无论行号/第 1 列如何),并将整个不匹配行输出到单独的文件中。

文件 A:

1 AA
2 BB
3 CC
4 DD
5 EE
6 FF
7 GG
8 HH

文件 B:

1 AA
2 BB
3 XX
4 XX
5 CC
6 DD
7 XX
8 FF
9 GG
10 XX
11 XX
12 HH

期望的输出:

3 XX
4 XX
7 XX
5 EE
10 XX
11 XX

fedorqui 建议我使用 awk 将 fileA 的第二列存储在一个数组中,然后遍历 fileB 以输出符合以下条件的行:

  1. 第 1 列存在于 fileA 中
  2. 但 fileB 中的第 2 列不同

    awk 'FNR==NR {a[$1]=$2; next} $1 in a && a[$1] != $2' fileA fileB
    

这很有帮助,直到我的代码在第 2 列中遇到 fileA 和 fileB 之间的第一个差异,然后代码输出以下所有行。

而不是这个,我想逐行比较 fileA 的第 2 列和 fileB 的第 2 列的数组。一旦代码遇到差异,它就会从 fileB 输出整个不匹配的行,然后将数组的同一行与 fileB 的下一行进行比较。它继续比较数组的同一行,输出 fileB 的不同行,直到找到匹配项。如果代码到达 fileB 的末尾并且没有找到匹配项,则从 fileA 输出该行,移动到数组的下一行并继续与 fileB 的每一行进行比较。这是可能的,还是比使用 awk 创建数组更简单的方法?

【问题讨论】:

    标签: arrays bash awk


    【解决方案1】:

    你可以使用这个awk:

    awk 'NR==FNR {a[$2]=$0;next} $2 in a{del[$2];next} 1;
         END{for (i in a) if (!(i in del)) print a[i]}' fileA fileB
    3 XX
    4 XX
    7 XX
    10 XX
    11 XX
    5 EE
    

    注意顺序与问题中显示的不符,因为最后打印了(fileA - fileB),而在遍历fileB 时计算了(fileB - fileA)

    【讨论】:

    • 这让我更接近了,谢谢。但是,当我在我的真实文件 A 和文件 B 上运行它时,我注意到输出中出现的文件 A 和文件 B 之间有很多行没有差异。其中许多行是同一字母的重复(例如,CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 和################################# ##)。你知道为什么会发生这种情况吗?
    • 如果您提供来自两个文件的新样本数据,那么我当然可以调查并提出修复建议。
    • 感谢阿努巴瓦。这是一个 github 链接,其中包含我运行的脚本 (awk_diff.sh)。它还包含前 20 行输出 (head20_output.fastq) 以及 fileA 和 fileB 的第 6130-6400 行。请注意,第 6144、6268 和 6380 行位于同一行的 fileA 和 fileB 第 2 列中,但出现在输出中。 github.com/agrobins/awk_diff
    猜你喜欢
    • 2021-04-27
    • 2015-12-02
    • 2014-08-24
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多