我有以下输入
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
-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