同じ最後の列に基づいて行にグループ化

同じ最後の列に基づいて行にグループ化

このようなデータがあります。

15 23
16 23
17 24
18 24

最後の列のデータに基づいて、最初の列のデータを結合/グループ化したいと思います。

15 16 23
17 18 24

どうすればいいですかawk

答え1

そしてawk

awk '{ seen[$2]= seen[$2]? seen[$2]FS$1:$1 } 
    END{ for (x in seen) print seen[x], x }' infile
15 16 23
17 18 24

seenここでは、列のキー$2と列の値を含む配列を使用します$1。各値のキーが$2同じ場合、値は配列の前の値の末尾に追加され、END最後の値が最初に印刷され、次にそのキーが印刷されます。

三項条件は、そのキーの前に配列に値があることを確認するために使用されます。その場合は、新しい値をデフォルト値の末尾に追加します。F生産するSFSそれ以外の場合は、その値を最初の値として追加します。

答え2

awk '{AA[$2]=AA[$2]" "$1}END{for(i in AA){print AA[i]" "i}}' datafile.txt

答え3

sed -Ee '
   :join
      $!N
      s/(\s\S+)\n(.*\1)$/ \2/
   tjoin
   P;D
'  input.txt

説明する:

  1. 両方の行をパターンスペースに保ちます。
  2. パターンスペースの最後のフィールドを確認して、2行を連結してみてください。
  3. 最後のフィールドを同じに保ちながら、この結合プロセスを繰り返します。
  4. 次に、異なる場合は、スペースで区切られたすべての前の行の最初のフィールドと共通の最後のフィールドを含む最初の部分を印刷します。この部分を削除してもう一度訪問してください。

関連情報