web-dev-qa-db-ja.com

行内の重複する単語の並べ替えと削除

sortコマンドを使用すると、行をアルファベット順に配置し、重複する行を削除できます。単語を1行に並べ替え、順番に並べ、重複を削除できる類似のものが必要です。これのためのコマンドはありますか?

例えば。:

zebra ant spider spider ant zebra ant

変更点:

ant spider zebra

最初の単語の前または最後の単語の後にスペースがありません。

31
Village

これは私のために働く:

$ echo "zebra ant spider spider ant zebra ant" | xargs -n1 | sort -u | xargs
ant spider zebra

xargs -n1を使用して、単一行の単語のリストを単一列に変換し、sort -uを使用して、xargsを使用して単一行に戻すことができます。

67
jcollado

シェルは_[:blank:]_で区切られたWordリストを既に解析するために構築されました。したがって、xargsの使用は完全に冗長です。 「ユニークな」ことはできますが、ソートを使用する方が簡単です。

echo $(printf '%s\n' zebra ant spider spider ant zebra ant | sort -u)

29
user735796

trを使用してスペースを新しい行に変更し、次にsortを使用し、最後に新しい行をスペースに戻します。

echo $(tr ' ' '\n' <<< "zebra ant spider spider ant zebra ant" | sort -u)
8
dogbane

これより前の回答はすべて、一度に1行のみをソートできます。以下は、そのような行のリスト全体をパイプするために使用でき、各行の一意の単語のソートされたリストを出力します。

awk '{ delete a; for (i=1; i<=NF; i++) a[$i]++; n=asorti(a, b); for (i=1; i<=n; i++) printf b[i]" "; print "" }'

これで使用される構文の多くを@jaypaiに感謝します。

例:

>cat file
group label wearable edit_group edit_group_order label_max camera_elevation camera_distance name label_min label_max value_min value_max camera_angle camera_elevation id
id group label wearable edit_group clothing_morph value_min value_max name value_default clothing_morph group
id label show_simple wearable name edit_group edit_group_order group clothing_morph clothing_morph camera_distance label_min label_max value_min value_max camera_distance camera_angle
id group label wearable name edit_group clothing_morph value_min value_max value_default
group label wearable id clothing_morph edit_group edit_group_order label_min label_max value_min value_max name camera_distance camera_angle camera_elevation
id group label wearable edit_group name label_min label_max value_min value_max wearable
name id group wearable edit_group id group wearable id group wearable id group wearable value_min value_max

>cat file | awk '{ delete a; for (i=1; i<=NF; i++) a[$i]++; n=asorti(a, b); for (i=1; i<=n; i++) printf b[i]" "; print "" }'
camera_angle camera_distance camera_elevation edit_group edit_group_order group id label label_max label_min name value_max value_min wearable 
clothing_morph edit_group group id label name value_default value_max value_min wearable 
camera_angle camera_distance clothing_morph edit_group edit_group_order group id label label_max label_min name show_simple value_max value_min wearable 
clothing_morph edit_group group id label name value_default value_max value_min wearable 
camera_angle camera_distance camera_elevation clothing_morph edit_group edit_group_order group id label label_max label_min name value_max value_min wearable 
edit_group group id label label_max label_min name value_max value_min wearable 
edit_group group id name value_max value_min wearable
3
Carlo Wood

awkを使用:

awk '{for(i=1;i<=NF;i++) a[$i]++} END{for(i in a) printf i" ";print ""}' INPUT_FILE

テスト:

[jaypal:~/Temp] cat file
zebra ant spider spider ant zebra ant
[jaypal:~/Temp] awk '{for (i=1;i<=NF;i++) a[$i]++} END{for (i in a) printf i" ";print ""}' file
zebra spider ant 
1
jaypal singh

Perlを使用:

Perl -lane '
  %a = map { $_ => 1 } @F;
  print join qq[ ], sort keys %a;
' <<< "zebra ant spider spider ant zebra ant"

結果:

ant spider zebra
1
Birei

pythonを使用

$ echo "zebra ant spider spider ant zebra ant" | python -c 'import sys; print(" ".join(sorted(set(sys.stdin.read().split()))))'
ant spider zebra
1
kev