286

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

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

tar
gz
java
gz
java
tar
class
class

我想查看如下列表:

tar
gz
java
class
4

8 回答 8

503

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

./yourscript.ksh | 排序 | 独特的

(仅供参考,是的,在此命令行中排序是必需的,uniq仅删除紧随其后的重复行)

编辑:

与Aaron Digullauniq命令行选项发布的内容相反:

给定以下输入:

班级
罐
罐
罐
斌
斌
爪哇

uniq将只输出所有行一次:

班级
罐
斌
爪哇

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

罐
斌

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

班级
爪哇
于 2009-03-06T10:34:51.973 回答
102
./script.sh | sort -u

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

于 2009-03-06T14:44:08.117 回答
13

使用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
于 2009-03-06T12:06:34.233 回答
11

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

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

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

与 " " 解决方案相比,它的优势sort | uniq在于无需预先进行排序。

于 2009-03-06T11:02:43.203 回答
11

使用 AWK,您可以:

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

我发现它比 sort 和 uniq 更快

于 2017-05-22T21:27:52.993 回答
9

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

uniq -d只给出重复的,uniq -u只给出唯一的(去除重复的)。

于 2009-03-06T10:35:05.047 回答
1

唯一,按要求(但未排序);
使用少于约 70 个元素的系统资源(经时间测试);
编写为从标准输入获取输入,
(或修改并包含在另一个脚本中):(
Bash)

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[@]}"
于 2012-07-28T21:00:13.100 回答
0

我得到了一个更好的提示来获取文件中的非重复条目

awk '$0 != x ":FOO" && NR>1 {print x} {x=$0} END {print}' file_name | uniq -f1 -u

于 2020-01-20T21:20:39.713 回答