如何删除带有重复单词的行?

时间:2014-01-10 12:27:29

标签: linux bash shell sed awk

我有一个包含多个列的文件,例如

abc cvn bla..bla..n_columns
xnt yuk m_columns
abc cvn xxxx
vbh ast
sth rty
xnt yuk

我想通过比较前两列中重复的单词对来创建一个新文件。 最终文件看起来像

abc cvn bla..bla..n_columns
xnt yuk m_columns
vbh ast
sth rty

3 个答案:

答案 0 :(得分:5)

您只需要:

awk '!seen[$1,$2]++' file

答案 1 :(得分:0)

  

如果abc cvn xxxx出现在abc cvn bla..bla..n_columns之前我只想要   保持任何一条线。这对我来说无关紧要   在那里。任何一行都没问题。

如果输出顺序无关紧要,您可以使用sort

sort -u -k1,2 file

否则你应该按照devnull的建议使用awk

答案 2 :(得分:0)

sed -n 'H
$ {x
   s/$/\
/
: again
   s/\(\n\)\([^ ]\{1,\} \{1,\}[^ [:cntrl:]]\{1,\}\)\(.*\)\1\2[^[:cntrl:]]*\n/\1\2\3\1/
   t again
   s/\n\(.*\)\n/\1/
   p
   }' YourFile

基于任何重复的值对象(对象是字符不是空格或\ n由“空格”分隔)在整个文本中有一个循环,同时有一个对等体已完成并被替换。

<强>原理

  1. H将每一行(在工作缓冲区中逐行工作)从工作缓冲区追加到保持缓冲区(有一个工作缓冲区和一个保持缓冲区)
  2. 最后
  3. $
  4. x交换工作并保持缓冲区,因此所有文件都在工作缓冲区中但以新行开头(由于附加操作)
  5. s/...在末尾添加一个新行(用于以后的替换流程分隔符)
  6. : again放置一个标签锚点(以后再转到)
  7. s/...//是该过程的核心。搜索单词的起始位置(在新行之后)和稍后的相同起始对等点(如果找到),将整个块替换为块起始处的部分,直到不包括第二个对等点。 (阻止从第一个对等体开始直到与第二个对等体在同一行上的新行)
  8. t again如果提前替换,请转到标签again
  9. s/.../删除在开始和结束时添加的新行
  10. p打印结果
  11. Sed总是尝试使用模式的mose,因此如果uniq对等体中有1个以上的对等体,则首先删除最后一个对等体并返回直到只有1个