【问题标题】:Script that deletes any duplicate line and keeps the original order删除任何重复行并保持原始顺序的脚本
【发布时间】:2020-06-27 15:26:17
【问题描述】:

需要编写一个脚本来处理标准输入并删除每个找到的重复行,直到标准输入结束。每个副本而且第一个选项的线性重复都会被删除,无论条目中是否有另一个或分散。标准输出仅显示没有重复条目的行(按收到的条目顺序)。
例如,我们有文件 test.txt 包含以下内容:

Whatever
You
Want
You
To
Whatever
Have
Here

输出应该删除所有重复的行,并且行的顺序与输入相同,如下所示:

Want
To
Have
Here

请注意,我们不知道文件包含什么(这只是一个示例)。我测试了许多命令,但找不到一个有效且符合要求的命令。

IMPORTANT NOTE : I need all occurences of the line to be deleted,

  not only all of them after the first one 

【问题讨论】:

  • 您的示例输入包含因空格数不同而不同的行(例如:You You )。为什么输出将它们视为相同?
  • 对于“小”输入中第一次出现相同行:| awk '!seen[$0]++'
  • 对于 large 输入:| cat -n | sort -k2 | uniq -f1 | sort -n -k1,1 | sed '^[ 0-9]*\t//'
  • 对于 huge(永无止境?)输入:在数据库中存储行并执行查找
  • sed 命令在我输入时出错:| cat -n | sort -k2 -s | uniq -f1 | sort -n -k1,1 | sed 's/^[ 0-9]*\t//'

标签: linux shell ubuntu terminal


【解决方案1】:

我不知道“每个副本以及线性重复的第一个选项都将被删除”是什么意思,但我认为您只是在寻找:

awk '!a[$0]++'

或许:

awk '!a[$1]++'

例如:

$ cat input
Whatever
You
Want
Whatever 1
You
To
Whatever 1
Have
Here
$ awk '!a[$0]++' input
Whatever
You
Want
Whatever 1
To
Have
Here
$ awk '!a[$1]++' input
Whatever
You
Want
To
Have
Here

【讨论】:

  • 我需要删除所有重复的行
  • @JonBjatBun 我不明白你的评论。第一个解决方案删除所有重复的行。第二种解决方案删除所有只有第一列重复的行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-25
相关资源
最近更新 更多