使用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会很好。
我也对任何解决方案的性能/复杂性感兴趣。
答案 0 :(得分: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
答案 1 :(得分: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
答案 2 :(得分: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