找到并且;删除Unix shell脚本中的重复字符串。如何?

时间:2013-03-18 00:44:56

标签: linux shell unix

我是一个Unix shell脚本新手。我知道几种不同的方法来查找重复项。但是在保持原始顺序的同时找不到删除重复项的简单方法(因为使用sort -u会丢失原始顺序)。

示例:名为dedupe.sh的脚本

示例运行:

dedupe.sh

cat dog cat bird fish bear dog

结果为:cat dog bird fish bear

3 个答案:

答案 0 :(得分:2)

使用

$ printf '%s\n' cat dog cat bird fish bear dog | awk '!arr[$1]++'
cat
dog
bird
fish
bear

$ echo 'cat dog cat bird fish bear dog' | awk '!arr[$1]++' RS=" "

$ printf '%s\n' cat dog cat bird fish bear dog | sort -u

如果它在中有效,它将在脚本中运行=)

答案 1 :(得分:1)

你说过Perl吗?

perl -e 'while($_=shift@ARGV){$seen{$_}++||print}print"\n" ' \
cat dog cat bird fish bear dog

同等地,dedupe.pl包含:

#!/usr/bin/perl
while ($w = shift @ARGV) {
    $seen{$w}++ || print "$w";
}
print "\n";

现在chmod u+x dedupe.pl和:

./dedupe.pl cat dog cat bird fish bear dog

无论哪种方式,输出都是所希望的。

cat dog bird fish bear 

答案 2 :(得分:0)

啊啊perl ...只写语言。 :)

只要您使用其他脚本语言,不妨考虑一些可读的东西。 :)

#!/usr/bin/env ruby

puts ARGV.uniq.join(' ')

表示:

puts = "print whatever comes next"
ARGV = "input argument array"
uniq = "array method to perform the behavior you're looking for and remove duplicates"
join(' ') = "join with spaces instead of default of newline. Not necessarily needed if you're piping to something else"