提取两组/文件之间的唯一值

2024-11-07 08:55:00
admin
原创
177
摘要:问题描述:在 linux/shell 环境中工作,如何完成以下操作:文本文件 1 包含:1 2 3 4 5 文本文件 2 包含:6 7 1 2 3 4 我需要提取文件 2 中不在文件 1 中的条目。所以在这个例子中是“6”和“7”。我如何从命令行执行此操作?非常感谢!解决方案 1:$ awk 'FNR==NR...

问题描述:

在 linux/shell 环境中工作,如何完成以下操作:

文本文件 1 包含:

1
2
3
4
5

文本文件 2 包含:

6
7
1
2
3
4

我需要提取文件 2 中不在文件 1 中的条目。所以在这个例子中是“6”和“7”。

我如何从命令行执行此操作?

非常感谢!


解决方案 1:

$ awk 'FNR==NR {a[$0]++; next} !($0 in a)' file1 file2
6
7

代码工作原理的解释:

  • 如果我们正在处理文件 1,请跟踪我们看到的每一行文本。

  • 如果我们正在处理文件 2,并且没有看到行文本,则打印它。

详细说明:

  • FNR是当前文件的记录号

  • NR是所有输入文件的当前总记录数

  • FNR==NR仅当我们读取 file1 时才为真

  • $0是当前文本行

  • a[$0]是一个哈希表,其键设置为当前文本行

  • a[$0]++跟踪我们看到的当前文本行

  • !($0 in a)仅当我们没有看到行文本时才为真

  • 如果上述模式返回 true,则打印文本行,这是未给出明确操作时的默认 awk 行为

解决方案 2:

使用一些鲜为人知的实用程序:

sort file1 > file1.sorted
sort file2 > file2.sorted
comm -1 -3 file1.sorted file2.sorted

3这将输出重复项,因此如果中有 1 file1,但 中有 2 file2,则仍将输出 1 3。 如果这不是您想要的,请在将输出写入文件之前将其通过sort管道传输:uniq

sort file1 | uniq > file1.sorted
sort file2 | uniq > file2.sorted
comm -1 -3 file1.sorted file2.sorted

GNU coreutils 包中有很多实用程序,允许进行各种文本操作。

解决方案 3:

我想知道以下哪种解决方案对于“较大”的文件来说是“最快”的:

awk 'FNR==NR{a[$0]++}FNR!=NR && !a[$0]{print}' file1 file2 # awk1 by SiegeX
awk 'FNR==NR{a[$0]++;next}!($0 in a)' file1 file2          # awk2 by ghostdog74
comm -13 <(sort file1) <(sort file2)
join -v 2 <(sort file1) <(sort file2)
grep -v -F -x -f file1 file2

我的基准测试结果简述如下:

  • 不要使用grep -Fxf,它太慢了(在我的测试中是 2-4 倍)。

  • comm比 稍快一些join

  • 如果 file1 和 file2 已经排序,commjoin比 awk1 + awk2 快得多。(当然,它们不假设文件已排序。)

  • awk1 + awk2 据称使用更多 RAM 和更少 CPU。实际运行时间较短,comm可能是因为它使用更多线程。awk1 + awk2 的 CPU 时间较短。

为了简洁起见,我省略了全部细节。不过,我假设任何感兴趣的人都可以联系我,或者只是重复测试。大致来说,设置是

# Debian Squeeze, Bash 4.1.5, LC_ALL=C, slow 4 core CPU
$ wc file1 file2
  321599   321599  8098710 file1
  321603   321603  8098794 file2

最快运行的典型结果

awk2: real 0m1.145s  user 0m1.088s  sys 0m0.056s  user+sys 1.144
awk1: real 0m1.369s  user 0m1.324s  sys 0m0.044s  user+sys 1.368
comm: real 0m0.980s  user 0m1.608s  sys 0m0.184s  user+sys 1.792
join: real 0m1.080s  user 0m1.756s  sys 0m0.140s  user+sys 1.896
grep: real 0m4.005s  user 0m3.844s  sys 0m0.160s  user+sys 4.004

顺便说一句,对于 awkies 来说:似乎a[$0]=1比 快a[$0]++,并且(!($0 in a))比 快(!a[$0])。因此,对于 awk 解决方案,我建议:

awk 'FNR==NR{a[$0]=1;next}!($0 in a)' file1 file2

解决方案 4:

怎么样:

diff file_1 file_2 | grep '^>' | cut -c 3-

这将打印 file_2 中不存在于 file_1 中的条目。要获得相反的结果,只需将 '>' 替换为 '<'。'cut' 会删除由 'diff' 添加的前两个字符,这两个字符不是原始内容的一部分。

文件甚至不需要排序。

解决方案 5:

使用 grep:

grep -F -x -v -f file_1 file_2 

解决方案 6:

这是另一个 awk 解决方案

$ awk 'FNR==NR{a[$0]++;next}(!($0 in a))' file1 file2
6
7

解决方案 7:

$ cat file1 file1 file2 | sort | uniq -u
6
7

uniq——报告或过滤文件中的重复行

... 如果输入中的重复行不相邻,则不会检测到,因此可能需要先对文件进行排序。

-u      Only output lines that are not repeated in the input.

打印 file1 两次以确保跳过 file1 中的所有条目uniq -u

解决方案 8:

cat file1 file2 | sort -u > unique

解决方案 9:

如果您确实想从命令行执行此操作,此站点(搜索“未找到重复项”)有一个awk搜索重复项的示例。这可能是查看该示例的一个很好的起点。

不过,我鼓励您使用 Perl 或 Python 来实现这一点。基本上,程序的流程如下:

findUniqueValues(file1, file2){
    contents1 = array of values from file1
    contents2 = array of values from file2
    foreach(value2 in contents2){
        found=false
        foreach(value1 in contents1){
            if (value2 == value1) found=true
        }
        if(!found) print value2
    }
}

这不是最优雅的方法,因为它的时间复杂度为 O(n^2),但它可以完成工作。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用