根据列向行添加标题

根据列向行添加标题

我有以下输入

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 coreutilssortawk

$ 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

-k3使用稳定 ( )排序对第三个字段 ( ) 上的输入文件进行排序-s,然后将输出通过管道传输到awk第三个字段,如果没有更改,则在其自己的行上打印第三个字段。然后打印当前记录(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

相关内容