我有一个ksh脚本,它返回一个长列表的值,换行符分隔,我想只看到唯一的/不同的值。这是可能的吗?
例如,我的输出是一个目录下的文件后缀:
焦油 广州 java 广州 java 焦油 类 类
我想看到这样的列表:
焦油 广州 java 类
我有一个ksh脚本,它返回一个长列表的值,换行符分隔,我想只看到唯一的/不同的值。这是可能的吗?
例如,我的输出是一个目录下的文件后缀:
焦油 广州 java 广州 java 焦油 类 类
我想看到这样的列表:
焦油 广州 java 类
当前回答
用zsh你可以这样做:
% cat infile
tar
more than one word
gz
java
gz
java
tar
class
class
zsh-5.0.0[t]% print -l "${(fu)$(<infile)}"
tar
more than one word
gz
java
class
或者你可以使用AWK:
% awk '!_[$0]++' infile
tar
more than one word
gz
java
class
其他回答
用zsh你可以这样做:
% cat infile
tar
more than one word
gz
java
gz
java
tar
class
class
zsh-5.0.0[t]% print -l "${(fu)$(<infile)}"
tar
more than one word
gz
java
class
或者你可以使用AWK:
% awk '!_[$0]++' infile
tar
more than one word
gz
java
class
通过sort和uniq对它们进行管道处理。这将删除所有重复项。
Uniq -d只给出重复项,Uniq -u只给出唯一项(条带重复项)。
您可能想看看uniq和sort应用程序。
./yourscript.ksh | sort | uniq
(仅供参考,是的,排序在这个命令行中是必要的,uniq只删除紧随其后的重复行)
编辑:
与Aaron Digulla发布的关于uniq命令行选项的文章相反:
给定以下输入:
class jar jar jar bin bin java
Uniq只输出一次所有行:
class jar bin java
Uniq -d将输出所有出现超过一次的行,并打印一次:
jar bin
Uniq -u将输出所有只出现一次的行,并打印一次:
class java
对于较大的数据集,排序可能是不可取的,你也可以使用以下perl脚本:
./yourscript.ksh | perl -ne 'if (!defined $x{$_}) { print $_; $x{$_} = 1; }'
它基本上只记住每一行输出,这样就不会再次输出。
与“sort | uniq”解决方案相比,它的优势在于不需要预先进行排序。
我得到了一个更好的提示,以获得文件中不重复的条目
awk '$0 != x ":FOO" && NR>1 {print x} {x=$0} END {print}' file_name | uniq -f1 -u