我有一个包含多个列的文件,例如
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
答案 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由“空格”分隔)在整个文本中有一个循环,同时有一个对等体已完成并被替换。
<强>原理强>
H
将每一行(在工作缓冲区中逐行工作)从工作缓冲区追加到保持缓冲区(有一个工作缓冲区和一个保持缓冲区)$
x
交换工作并保持缓冲区,因此所有文件都在工作缓冲区中但以新行开头(由于附加操作)s/...
在末尾添加一个新行(用于以后的替换流程分隔符): again
放置一个标签锚点(以后再转到)s/...//
是该过程的核心。搜索单词的起始位置(在新行之后)和稍后的相同起始对等点(如果找到),将整个块替换为块起始处的部分,直到不包括第二个对等点。 (阻止从第一个对等体开始直到与第二个对等体在同一行上的新行)t again
如果提前替换,请转到标签again
s/.../
删除在开始和结束时添加的新行p
打印结果Sed总是尝试使用模式的mose,因此如果uniq对等体中有1个以上的对等体,则首先删除最后一个对等体并返回直到只有1个