次のリストがあります。
1 2 5 2
1 5 5 3
1 5 5 5
5 2 2 2
2 2 4 3
各行を並べ替えて、次の一意の値を取得したいと思いますsort | uniq
。
1 2 5
1 3 5
1 5
2 5
2 3 4
オンラインでソリューションを探していますが、列で並べ替えるソリューションのみを見つけることができます。どのように出力を取得できますか?よろしくお願いします。
ベストアンサー1
行内の列よりも行をソートする方が簡単なので、1つのアプローチは各行を転置して(各フィールドが行になるように)適用してから転置するsort
ことuniq
です。
以下は、GNUツールを想定した簡単な実装です。
$ while read -r line; do echo "$line" | grep -o '[^ ]*' | sort -h | uniq | paste -s; done <file
file
各行に対してループを介して、次の操作を行います。
grep
-o
オプション(各行の一致する部分のみを印刷)を使用して入力を次に分割します。N一致する部分文字列ごとに1つずつ。ここでは、スペースを除くすべての項目を一致させます。- 分割線は、
-h
人間が読める数字を比較するオプションを使用してソートされます(フィールドを英数字文字列でソートするには、このオプションを削除します-h
)。 - この
uniq
コマンドは重複した項目を削除します。 paste -s
標準入力の各行を、タブ区切りの単一行フィールドとして印刷します。末尾の| tr '\t' ' '
文字を追加してタブを空白に変更できます。
しかし、ループを使用してテキストを処理することは通常悪い習慣と考える。