除 header 外,颠倒行序

Reverse line order except header

我想使用 shell 命令反转文本文件的行,不包括 header 行。

Number,Letter,Person
1,a,Alice
2,b,Bob
3,c,Claire

应该变成

Number,Letter,Person
3,c,Claire
2,b,Bob
1,a,Alice

我正在寻找 一个 "in place" 解决方案(更改原始文件)和一个流解决方案(从 stdin 读取原始文件并将结果打印到 stdout)。

理想情况下,命令或脚本应该 POSIX 兼容,但其他解决方案也可能很有趣。一个 oneliner 就好了。

我也对任何解决方案的 performance/complexity 感兴趣。

这是执行此操作的 awk 命令:

awk '{a[NR]=[=10=]} END{print a[1]; for (i=NR; i>1; i--) print a[i]}' file

Number,Letter,Person
3,c,Claire
2,b,Bob
1,a,Alice

这里a[1]表示头记录。关联数组中的剩余条目 a 表示索引为记录号的行。

或者,使用 head, tail, cat:

{ head -1 f && tail -n +2 file | tac; } > file._tmp && mv file._tmp file

Number,Letter,Person
3,c,Claire
2,b,Bob
1,a,Alice

使用 GNU sed:

sed -n '1p;2h;3,${G;h};$p' file

输出:

Number,Letter,Person
3,c,Claire
2,b,Bob
1,a,Alice

如果您想编辑文件 "in place" 使用 sed 的选项 -i


参见:man sed

$ awk -v OFS='\t' '{print (NR==1), NR, [=10=]}' file | sort -snr -k1 -k2 | cut -f3-
Number,Letter,Person
3,c,Claire
2,b,Bob
1,a,Alice