1

私は Unix シェル スクリプトの初心者です。重複を見つけるためのいくつかの異なる方法を知っています。ただし、元の順序を維持しながら重複を削除する簡単な方法を見つけることができません ( sort -u を使用すると元の順序が失われるため)。

例: 呼び出されるスクリプトdedupe.sh

サンプルラン:

dedupe.sh

cat dog cat bird fish bear dog

結果:cat dog bird fish bear

4

3 に答える 3

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

で動作する場合は、スクリプトで動作します =)

于 2013-03-18T01:06:16.800 に答える
1

パールって言った?

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 
于 2013-03-18T00:59:04.107 に答える
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"
于 2013-03-18T01:30:13.960 に答える