Bash文字列に含まれる一意の単語を表示するには? [閉鎖]

Bash文字列に含まれる一意の単語を表示するには? [閉鎖]

ワードファイルの内容:

a-b-c
c-b-a
c-a-b
d-a-x‬

私は出力だけが欲しい:

a-b-c
d-a-x

次の理由から:

c-b-a  
c-a-b 

これらの組合せは以下に由来する。a-b-c

答え1

以下はPerlソリューションです。 awkでの実装は練習として残されます。

$ perl -F'-' -lnE 'say $_ unless $seen{join "-", sort @F}++' file
a-b-c
d-a-x‬

-要素がすべて単一文字の場合は区切り文字を再挿入する必要はありませんが、他の場合は区切り文字が重要になります(ab-c例:差別化a-bc)。

答え2

単語が実際にダッシュで区切られた単純な文字列であると仮定すると、次のようになります。シュワルツ変換このように

#!/bin/bash
# Assumes words are in /tmp/words

while IFS= read line
do
    sorted=$(printf "%s\n" "$line" | tr - '\n' | LC_ALL=C sort | tr '\n' -)
    # printf "sorted= >%s<, line= >%s<\n" "$sorted" "$line" >&2
    printf "%s\t%s\n" "$line" "$sorted"
done < /tmp/words |
    sort -t $'\t' -uk2,3 |
    cut -f1

ダッシュ間の「単語」は分離され、英数字でソートされ、再結合されます。 (printfソートされた行を表示するには、中間部分のコメントを外します。)これは、sort一意性制約を持つソートキーとして使用されるため、重複キーを含む行は削除されます。副作用は元の順序が変わることです。これが許可されていない場合は、質問でこれを新しい要件として宣言する必要があります。その後、ソートキーを破棄して元のデータを出力します。

質問に提供されたデータのサンプル出力

a-b-c
d-a-x‬

ガイドライン

  1. データがダッシュで区切られた「単語」であるとします。
  2. データに奇妙な文字(タブ、改行)が含まれていないとします。

関連情報