列に基づいて行にタイトルを追加する

列に基づいて行にタイトルを追加する

私は次のような入力を持っています

a b danny
c d joe
1 4 danny
d 5 dana
e f joe
t 4 dana

最後の列に基づいてソートして、各行セットにヘッダーとして追加したいと思います。 Linuxでは、次のように出力されます(グループの順序は重要ではありません)。

dana
d 5 dana
t 4 dana
danny
a b danny
1 4 danny
joe
c d joe
e f joe

(e)grep / sed / awkや他のコマンドラインツールを使用して実行できますか?

答え1

GNU coreutilssortと以下を使用してくださいawk

$ sort -sk3 file | awk '$3!=group{ group=$3; print group }1'
dana
d 5 dana
t 4 dana
danny
a b danny
1 4 danny
joe
c d joe
e f joe

-k3stable( ) sorting を使用して 3 番目のフィールド ( ) で入力ファイルをソートし、出力を 3 番目のフィールドにパイプし、-s変更awkがない場合は、3 番目のフィールドを独自の行に印刷します。次に、現在のレコード(1)を印刷します。

答え2

出力順序は重要ではないと述べたので、最後のフィールドの値としてキー付きレコードの連想配列を作成し、最後にキーと値を印刷できます。

awk '
  {a[$NF] = a[$NF] (a[$NF] ? ORS : "") $0} 
  END {for (i in a){print i; print a[i]}}
' file
joe
c d joe
e f joe
dana
d 5 dana
t 4 dana
danny
a b danny
1 4 danny

または、値を初めて表示するときは、値の前にキーを追加してください。

awk '
  {a[$NF] = (($NF in a) ? a[$NF] : $NF) ORS $0} 
  END {for (i in a) print a[i]}
' file
joe
c d joe
e f joe
dana
d 5 dana
t 4 dana
danny
a b danny
1 4 danny

もしあなたならするグループをソートしてGNU awk> 4.0を使用するには、次の構造を使用して達成できますPROCINFO[]

gawk '
  {a[$NF] = (($NF in a) ? a[$NF] : $NF) ORS $0}
  END {PROCINFO["sorted_in"] = "@ind_str_asc"; for (i in a) print a[i]}
' file
dana
d 5 dana
t 4 dana
danny
a b danny
1 4 danny
joe
c d joe
e f joe

関連情報