Answers:
perl -ne 'print unless $seen{$_}++' data.txt
或者,如果您必须无用的使用cat
:
cat data.txt | perl -ne 'print unless $seen{$_}++'
这是awk
针对缺少Perl的系统的翻译:
awk '!seen[$0]++' data.txt
cat data.txt | awk '!seen[$0]++'
if
,print
:,括号,括号和awk '!seen[$0]++'
john有一个名为的工具unique
:
usr@srv % cat data.txt | unique out
usr@srv % cat out
aaaaaa
cccccc
bbbbbb
在单个命令行中不使用其他工具就可以实现相同的目标比较复杂:
usr@srv % cat data.txt | nl | sort -k 2 | uniq -f 1 | sort -n | sed 's/\s*[0-9]\+\s\+//'
aaaaaa
cccccc
bbbbbb
nl
打印中的行前行号,所以如果我们sort
/ uniq
他们的背后,我们可以恢复行的原始顺序。sed
只是随后删除行号;)
nl -ba -nrz data.txt | sort -k2 -u | sort | cut -f2
我更喜欢使用这个:
cat -n data.txt | sort --key=2.1 -b -u | sort -n | cut -c8-
cat -n
添加行号,
sort --key=2.1 -b -u
在第二个字段上排序(在添加的行号之后),忽略前导空格,保持唯一行
sort -n
以严格的数字顺序排序
cut -c8-
将第8列中的所有字符都保留为EOL(即,省略我们包含的行号)
Perl有一个可以使用的模块,其中包括一个名为的函数uniq
。因此,如果您在Perl中将数据加载到数组中,则只需调用此函数即可使其唯一,但仍保持原始顺序。
use List::MoreUtils qw(uniq)
@output = uniq(@output);
您可以在这里阅读有关此模块的更多信息:List :: MoreUtils
{ if (!seen[$0]++) print }