Ara*_*ash 7 linux bash perl uniq
如何删除每一行中的重复项,例如这里?
1 1 1 2 1 2 3
5 5 4 1 2 3 3
Run Code Online (Sandbox Code Playgroud)
我想得到这个输出:
1 2 3
5 4 1 2 3
Run Code Online (Sandbox Code Playgroud)
有很多行(100,000),在每一行中我都想要唯一的值。Perl 可能是最快的,但我怎样才能在 Perl 或 Bash 中做到呢?
ner*_*ler 13
这是一个使用 awk 的选项:
awk '{ while(++i<=NF) printf (!a[$i]++) ? $i FS : ""; i=split("",a); print ""}' infile > outfile
Run Code Online (Sandbox Code Playgroud)
编辑更新评论:
while (++i<=NF)
初始化 while 循环,预加“i”,因为 $0 是 awk 中的完整行。
所以它从 1 美元(第一个字段)开始。循环遍历该行直到结束(小于或等于 'NF',它内置于 awk 中,表示“字段数”)。默认字段分隔符是一个空格,您可以轻松更改默认分隔符。
printf (!a[$i]++) ? $i FS : ""
这是一个三元运算。
因此,如果 input 不在数组中!a[$i]++
,则打印 $i,如果是,则打印 ""。(如果您不喜欢这种方式,可以删除!
并反转$i FS : ""
)。
i=split("",a)
通常,这是一个空分割。在这种情况下,它为下一行重置 I。
print ""
结束输出行(实际上不是 100% 为什么),否则您将得到以下输出:
1 2 3 5 4 1 2 3
代替
1 2 3
5 4 1 2 3
因为ruby
我知道的任何 Linux 发行版都有:
ruby -e 'STDIN.readlines.each { |l| l.split(" ").uniq.each { |e| print "#{e} " }; print "\n" }' < test
Run Code Online (Sandbox Code Playgroud)
这里,test
是包含元素的文件。
为了解释这个命令的作用——尽管 Ruby 几乎可以从左到右阅读:
< test
你的 shell)split(" ")
)print "#{e} "
)