Bash 脚本:如何在对文本或 csv 文件进行排序时跳过标题行,同时将其保留在输出中

Bash script: how to skip a header line when sorting a text or csv file, while retaining it in the output

提问人:FondDuLac 提问时间:1/21/2023 最后编辑:FondDuLac 更新时间:1/21/2023 访问量:106

问:

(改编自:加入手册,标题行)。

我正在对一个名为 file1 的文件进行排序,其中包含以下内容:

Name   Age
Charlie 34
Alice   25

如果我只是写:

sort -k2b,2 file1

我得到:

Alice   25
Charlie 34
Name   Age

我可以像这样从排序中排除标题:

head -1 file1 ;(sed -n '2,$p' file1|sort -k2b,2)

但是 gnu 手册中的例子是这样的:

( sed -u 1q ; sort -k2b,2 ) < file1

为什么会这样?

我认为我会从命令行中得到这个:

Name   Age
Alice   25
Charlie 34
Name   Age

sed 消耗了 stdin 的第一行,然后排序消耗了其余的?

bash stdin io-redirection 子shell

评论

3赞 markp-fuso 1/21/2023
sed 消耗了 stdin 的第一行,然后排序消耗了其余的?- 是的,从 stdin 中剥离第一行并转储到 stdout,而 将 stdin 的其余部分馈送,然后转储到 stdoutsedsort
1赞 markp-fuso 1/21/2023
默认情况下,将缓冲输入,因此如果输入量可以放入初始缓冲区,则将打印第一行并丢弃缓冲区的内容,这意味着不会传递任何内容;告诉不要缓冲任何东西,一次读取/处理一行,因此当命中时,stdin 的其余部分仍然可以传递给sed1qsort-usedsedqsort
1赞 Barmar 1/21/2023
重要的概念是两者从同一流读取,而不是文件的独立打开。所以从结束的地方开始阅读。sedsortsortsed
2赞 Diego Torres Milano 1/21/2023
( head -n 1 ; sort -k2b,2 ) < file也应该工作
3赞 Mark Setchell 1/21/2023
因此,应该少一个子进程。{ head -n 1 ; sort -k2b,2 ; } < file

答:

0赞 Cole Tierney 1/21/2023 #1

您可以打印标题,然后对其余部分进行排序。

sed -n '1p' file1; sort <(sed '1d' file1)
Name   Age
Alice   25
Charlie 34