我想基于多个列从文件中删除所有重复出现的事件。 这是一个玩具示例:

想要通过前4列删除所有不唯一的记录。 因此,将awk脚本应用于:

    BLUE,CAR,RED,HOUSE,40
    BLUE,CAR,BLACK,HOUSE,20
    BLUE,CAR,GREEN,HOUSE,10
    BLUE,TRUCK,RED,HOUSE,40
    BLUE,TRUCK,GREEN,HOUSE,40
    BLUE,TRUCK,RED,HOUSE,40

应该导致

    BLUE,CAR,RED,HOUSE,40
    BLUE,CAR,BLACK,HOUSE,20
    BLUE,CAR,GREEN,HOUSE,10
    BLUE,TRUCK,GREEN,HOUSE,40

我努力了:

awk -F"," -v OFS="," '{cnt[$1,$2,$3,$4]++} END {for (rec in cnt) if (cnt[rec] == 1) print rec}' ss.txt

这将成功删除两个重复项,但不应用正确的分隔符或不打印整个记录,从而导致:

    BLUECARREDHOUSE
    BLUETRUCKGREENHOUSE
    BLUECARBLACKHOUSE
    BLUECARGREENHOUSE

我更喜欢awk解决方案,但是任何便携式解决方案都值得欢迎。

#1楼 票数:3 已采纳

假设您希望整个记录具有前4列中唯一的记录,则可以完成此工作:

awk -F',' '{cnt[$1,$2,$3,$4]++;line[$1,$2,$3,$4] = $0}
           END {for (rec in cnt) if (cnt[rec] == 1) print line[rec]}' \
    ss.txt

保存行和计数; 取回您输入的内容。 如果您有千兆字节的文件,这会很痛苦; 有一些方法仅在需要时保存唯一行。 这只会保存每行的第一个版本,并在已知条目不唯一时将其删除。 (未经测试-但我认为应该可以。根据Ed Morton的 评论进行修改。)

awk -F',' '{ if (cnt[$1,$2,$3,$4]++ == 0)
                 line[$1,$2,$3,$4] = $0
             else
                 delete line[$1,$2,$3,$4]
           }
           END {for (rec in line) print line[rec]}' \
    ss.txt

如果只需要4个关键列,那么这只会将4列保存为您要打印的逗号分隔格式:

awk -F',' '{cnt[$1,$2,$3,$4]++;line[$1,$2,$3,$4] = $1 "," $2 "," $3 "," $4}
           END {for (rec in cnt) if (cnt[rec] == 1) print line[rec]}' \
    ss.txt

  ask by mlegge translate from so

未解决问题?本站智能推荐:

2回复

有没有办法在Unix中删除文件中的重复标题?

如何从文件中删除多个标头? 我从如何在Unix中删除文件中的重复行后,尝试使用以下代码? 。 它正在删除文件中的所有重复记录。 但在我的情况下,我只需要删除标题重复项,而不是文件中的重复记录。 例如,我有一个包含以下数据的文件: 我期待输出如下:
1回复

合并多个文本文件并删除重复项

我有大约350个文本文件(每个文件大约75MB)。 我正在尝试合并所有文件并删除重复的条目。 该文件采用以下格式: 我写了一个小的shell脚本来做这件事 我经常进行这种处理,并且想知道下次运行时我是否可以采取任何措施来改进处理。 我对任何编程语言和建议持开放态度。 谢谢!
2回复

使用awk删除重复文件时出现问题

part3.1.awk的内容 要获取进程列表,我在终端中运行它。 我想获取带有删除的重复项并进行排序的输出。 $ ps -ef | awk -f part3.1.awk | 分类 我在做什么错?
2回复

计算文本文件中重复行数的更简单方法

我有一个看起来像这样的文本文件: 预期的输出是这样的: 我知道有一个解决方案: 该代码进行排序,删除重复项,然后再次排序,并输出预期的输出。 但是,有没有更简单的方法来表示z [$ 1] ++ {a [$ 1] = $ 0}部分? 我的意思是说更“基本”。
2回复

如何使用awk脚本删除选定的行?

我正在通过一些awk命令来传递程序的输出,并且几乎可以满足我的需求了。 到目前为止的命令是: 最后一点是穷人的uniq ,我的目标无法使用。 如果有机会,上述命令将产生如下输出: 我想拥有的是: 也就是说,我只想打印给定标签(第一个“字段”)具有最大值的行。 上面的示例代表at
1回复

Grep仅部分重复之一

我已经收集了以下文件: 这是一个; 带4列的分隔文件。 但是,第2列和第3列的组合必须唯一。 由于此数据集具有数百万行,因此我正在寻找一种有效的方法来使每个重复项都首次出现。 因此,我需要部分匹配第2列和第3列的组合,然后选择第一个。 预期结果应为: 我自己做了几次尝试。
3回复

如何在vim中删除密切重复的行

我有以下几行: 所以在这里,如果第一个字段对于多行是相同的,则认为它们是重复的。 因此,在上面的例子中,123在2行中是相同的,它们被认为是重复的(尽管它们在中间的一个字段中不同)。 类似地,具有234的行是重复的。 我需要删除这些重复的行。 由于它们不是100%重复,因此sort
2回复

查找unix文件中所有以“#”开头的单词

输入文件看起来像这样:- 输出应该看起来像