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