除 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
我想使用 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