当前位置:  开发笔记 > 编程语言 > 正文

从UNIX shell脚本中的列表中选择唯一值或不同值

如何解决《从UNIXshell脚本中的列表中选择唯一值或不同值》经验,为你挑选了6个好方法。

我有一个ksh脚本,它返回一长串值,换行符分隔,我想只看到唯一/不同的值.有可能这样做吗?

例如,假设我的输出是目录中的文件后缀:

tar
gz
java
gz
java
tar
class
class

我希望看到如下列表:

tar
gz
java
class

Matthew Scha.. 405

您可能想要查看uniqsort应用程序.

./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

GNU`sort`具有`-u`版本,用于提供唯一值. (4认同)

只是后来者的一个FYI:@AaronDigulla的答案已被纠正. (2认同)

非常好的一点,在这个命令行中这种排序是必要的,uniq只会删除我刚刚学到的紧接着的重复行! (2认同)


gpojd.. 82

./script.sh | sort -u

这与一氧化碳的 答案相同,但更简洁一点.



1> Matthew Scha..:

您可能想要查看uniqsort应用程序.

./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


GNU`sort`具有`-u`版本,用于提供唯一值.
只是后来者的一个FYI:@AaronDigulla的答案已被纠正.
非常好的一点,在这个命令行中这种排序是必要的,uniq只会删除我刚刚学到的紧接着的重复行!

2> gpojd..:
./script.sh | sort -u

这与一氧化碳的 答案相同,但更简洁一点.


你是谦虚的:你的解决方案也会更好_perform_(可能只有大数据集时才会注意到).

3> paxdiablo..:

对于可能不需要排序的较大数据集,您还可以使用以下perl脚本:

./yourscript.ksh | perl -ne 'if (!defined $x{$_}) { print $_; $x{$_} = 1; }'

这基本上只记住每一行输出,以便它不再输出.

它具有优于" sort | uniq"解决方案的优点,因为预先不需要排序.


当我想要第一次出现每一行时,这很好.排序会破坏这一点.
请注意,对一个非常大的文件进行排序本身并不是一个问题; 它可以对大于可用RAM +交换的文件进行排序.如果只有很少的重复项,Perl,OTOH将会失败.

4> Dimitre Rado..:

使用zsh,您可以这样做:

% cat infile 
tar
more than one word
gz
java
gz
java
tar
class
class
zsh-5.0.0[t]% print -l "${(fu)$(

或者您可以使用AWK:

% awk '!_[$0]++' infile    
tar
more than one word
gz
java
class


巧妙的解决方案,不涉及对输入进行排序.注意事项:非常高明,但是,神秘的`awk`溶液(见http://stackoverflow.com/a/21200722/45375有关说明)将与大文件工作,只要的唯一线路的数量是足够小(因为独特的线条保存在记忆中).`zsh`解决方案首先将整个文件读入内存,这可能不是大文件的选项.另外,如上所述,只有没有嵌入空格的行才能正确处理; 解决这个问题,使用`IFS = $'\n'读-d''-r -A u
5> Aaron Digull..:

管道穿过sortuniq.这将删除所有重复项.

uniq -d仅给出重复项,uniq -u仅给出唯一的(重复条带).



6> Ajak6..:

使用AWK,我发现它比排序更快

 ./yourscript.ksh | awk '!a[$0]++'

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有