unix コマンドを使用して各行の固有値を取得します。

unix コマンドを使用して各行の固有値を取得します。

次のリストがあります。

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' ' '文字を追加してタブを空白に変更できます。

しかし、ループを使用してテキストを処理することは通常悪い習慣と考える

おすすめ記事