如何用sed删除部分重复的行?

时间:2016-12-16 21:53:27

标签: regex shell unix sed

我有一个包含数千行文本的文本文件,其中包含域名列表,后跟域后面包含不同信息的句点(数字,空格,其他信息)

某些域可能包含超过1行的信息,之后会有不同的数字和信息,例如本示例中的域1和域

domain1.foo. 3600 ...
domain1.foo. 1800 ...
domain2.foo. 900 ...
domain3.foo. 60 ...
domain4.foo. 3600 ...
domain4.foo. 1200 ...
domain4.foo. 1200 ...

重复的列表只会是彼此之下的行(例如,涉及domain4的行可能是50,51,52行,但不会是50,60和400行。)

所以我要做的是创建使用sed删除包含每个域名的任何重复行,无论后面是什么 - 所以示例将成为

domain1.foo. 3600 ...
domain2.foo. 900 ...
domain3.foo. 60 ...
domain4.foo. 3600 ...

我只有正则表达式的基本知识,并希望得到一些帮助,如何解决这个问题。我设法将列表格式化,因此删除了标签和双空格,但我需要一点帮助。

2 个答案:

答案 0 :(得分:2)

拯救:

#content {
  padding:10px;
  border:2px solid blue;
  overflow:hidden;
  display: flex;          /* NEW */
  flex-direction: column; /* NEW */
}

这可以通过将变量$ awk 'last != $1; {last = $1}' domain1.foo. 3600 ... domain2.foo. 900 ... domain3.foo. 60 ... domain4.foo. 3600 ... 设置为第一列的值来实现。仅当第一列与last不相同时,才会打印当前行。

你也可以用sed来做,但你真的不应该这样做:

last

以上工作方法是将下一行读入模式空间,并检查每行中的第一列是否相同。

如果它们相同,则删除最后一行,然后脚本再次跳转到开头。

两列不同后,第一列打印,然后删除,第二行重复脚本。

sed ':s;N;/^\([^ ]*\) [^\n]*\n\1/{s/\n.*//;bs};P;D'

答案 1 :(得分:0)

andlcr's helpful awk answer是可行的方法,特别是考虑到可移植(符合POSIX标准)并且使用可变长度域名。

在这个简单的案例中

  • 在行前缀中给出固定数量的字符。

  • 如果您的平台具有uniq GNU 实现(请与 uniq --version

以下内容也适用:

uniq -w 12 file