我有一个ksh脚本,它返回一长串值,换行符分隔,我想只看到唯一/不同的值。有可能这样做吗?
例如,假设我的输出是目录中的文件后缀:
tar gz java gz java tar class class
我希望看到如下列表:
tar gz java class
答案 0 :(得分:360)
您可能希望查看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
答案 1 :(得分:74)
./script.sh | sort -u
这与monoxide's answer相同,但更简洁一些。
答案 2 :(得分:9)
通过sort
和uniq
对其进行管道传输。这将删除所有重复项。
uniq -d
仅提供重复项,uniq -u
仅提供唯一的(重复条带)。
答案 3 :(得分:9)
对于可能不需要排序的较大数据集,您还可以使用以下perl脚本:
./yourscript.ksh | perl -ne 'if (!defined $x{$_}) { print $_; $x{$_} = 1; }'
这基本上只记住每一行输出,以便它不再输出它。
它优于“sort | uniq
”解决方案,因为预先不需要排序。
答案 4 :(得分:9)
使用 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 '!_[$0]++' infile
tar
more than one word
gz
java
class
答案 5 :(得分:6)
你可以使用AWK,我发现它比排序
更快 ./yourscript.ksh | awk '!a[$0]++'
答案 6 :(得分:1)
根据要求,唯一(但未分类);
使用较少的系统资源,少于约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[@]}"
答案 7 :(得分:0)
我有一个更好的技巧来获取文件中不重复的条目
awk '$0 != x ":FOO" && NR>1 {print x} {x=$0} END {print}' file_name | uniq -f1 -u