linux - 比较一个字段,如果另一字段的值更大,则删除重复项

标签 linux awk sed unique text-manipulation

尝试在 Linux 命令行中执行此操作。想要合并两个文件,根据 ID 比较值,但只保留具有较新/较大日期值的 ID(编辑:等于或大于)。由于 ID 456604 位于两个文件中,因此只想保留文件 2 中日期较新的 ID:“20111015 456604 tgf”

文件1

Date     ID     Note
20101009 456604 abc
20101009 444444 abc
20101009 555555 abc
20101009 666666 xyz

文件2

Date     ID     Note
20111015 111111 abc
20111015 222222 abc
20111015 333333 xyz
20111015 456604 tgf

然后输出将两个文件合并,但仅保留第二个 ID 值和较新的日期。行的顺序并不重要,只是概念输出的示例。

输出

Date     ID     Note
20101009 444444 abc
20101009 555555 abc
20101009 666666 xyz
20111015 111111 abc
20111015 222222 abc
20111015 333333 xyz
20111015 456604 tgf

最佳答案

$ cat file1.txt file2.txt | sort -ru | awk '!($2 in seen) { print; seen[$2] }'

Date     ID     Note
20111015 456604 tgf
20111015 333333 xyz
20111015 222222 abc
20111015 111111 abc
20101009 666666 xyz
20101009 555555 abc
20101009 444444 abc

按日期降序对合并的文件进行排序,并且仅在第一次看到 ID 时打印一行。

编辑

更紧凑的版本,感谢史蒂夫:

cat file1.txt file2.txt | sort -ru | awk '!seen[$2]++'

关于linux - 比较一个字段,如果另一字段的值更大,则删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27697755/

相关文章:

c++ - 没有 GTK 包括

regex - bash 中的正则表达式不贪婪

multithreading - 如何使 sed 匹配多行模式

linux - grep 只是带有最新时间戳的 uniq 数据

linux - 我正在尝试在我的 Cisco ACE 负载平衡配置中搜索文本的 "sections"

linux - 启动时访问 jenkins JAR

c++ - 在 Windows 上运行 Linux Makefile(.so 文件)

json - 如何解析 JSON 文件并将其转换为 CSV 文件?

linux - 使用 awk 和 sed 从 STDIN 重新格式化并执行

macos - 为什么sed在接收多个文件作为输入时只处理一个文件?