除标题之外的反向行顺序

问题描述 投票:2回答:3

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

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

应该成为

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

我正在寻找“就地”解决方案(更改原始文件)和流媒体解决方案(从stdin读取原始文件并将结果打印到stdout)。

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

我也对任何解决方案的性能/复杂性感兴趣。

shell unix awk posix
3个回答
6
投票

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

awk '{a[NR]=$0} 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

2
投票

使用GNU sed:

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

输出:

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

如果要“就地”编辑文件,请使用sed的选项-i


见:man sed


1
投票
$ awk -v OFS='\t' '{print (NR==1), NR, $0}' file | sort -snr -k1 -k2 | cut -f3-
Number,Letter,Person
3,c,Claire
2,b,Bob
1,a,Alice
© www.soinside.com 2019 - 2024. All rights reserved.