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

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

tar
gz
java
gz
java
tar
class
class

我想看到这样的列表:

tar
gz
java
class
有帮助吗?

解决方案

您可能想看看 uniqsort 应用程序。

./yourscript.ksh | sort | uniq

(仅供参考,是的,在此命令行中排序是必要的, uniq 仅删除紧接着彼此的重复行)

编辑:

与发布的内容相反 亚伦·迪古拉 和---关联 uniq的命令行选项:

给定以下输入:

class
jar
jar
jar
bin
bin
java

uniq 将输出所有行一次:

class
jar
bin
java

uniq -d 将输出所有出现多次的行,并将打印一次:

jar
bin

uniq -u 将输出所有只出现一次的行,并且将它们打印一次:

class
java

其他提示

./script.sh | sort -u

这与 monoxide's 相同 answer ,但更简洁一点。

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

./yourscript.ksh | perl -ne 'if (!defined $x{

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

<*>

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

它优于“ sort |” uniq的&QUOT;解决方案,因为预先不需要排序。

}) { print

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

<*>

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

它优于“ sort |” uniq的&QUOT;解决方案,因为预先不需要排序。

; $x{

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

<*>

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

它优于“ sort |” uniq的&QUOT;解决方案,因为预先不需要排序。

} = 1; }'

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

它优于“ sort |” uniq的&QUOT;解决方案,因为预先不需要排序。

使用 zsh ,您可以这样做:

zsh-5.0.0[t]% 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:

zsh-4.3.9[t]% awk '!_[<*>]++' infile    
tar
more than one word
gz
java
class

通过 sort uniq 来管道它们。这将删除所有重复项。

uniq -d 仅提供重复项, uniq -u 仅提供唯一的(条带重复)。

你可以使用AWK,我发现它比排序

更快
 ./yourscript.ksh | awk '!a[<*>]++'

根据要求,唯一(但未排序);
使用较少的系统资源,少于约70个元素(随着时间的推移测试);
写入从stdin获取输入,
(或修改并包含在另一个脚本中):
(击)

bag2set () {
    # Reduce a_bag to a_set.
    local -i i j n=${#a_bag[@]}
    for ((i=0; i < n; i++)); do
        if [[ -n ${a_bag[i]} ]]; then
            a_set[i]=${a_bag[i]}
            a_bag[i]=\0'
            for ((j=i+1; j < n; j++)); do
                [[ ${a_set[i]} == ${a_bag[j]} ]] && a_bag[j]=\0'
            done
        fi
    done
}
declare -a a_bag=() a_set=()
stdin="$(</dev/stdin)"
declare -i i=0
for e in $stdin; do
    a_bag[i]=$e
    i=$i+1
done
bag2set
echo "${a_set[@]}"
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top