Unix跳过头部的Bash函数

3

我在stackoverflow上找到了一个名为“body”的bash函数,它可以回显文件的标题(第一行),并将正文(其余行)传递给标准输出。这对我处理有标题的文件非常有用。

例如:

file.csv:

field1,field2
a,2
b,1

命令:

$ sort -k2,2 -nr file.csv -t,
a,2
b,1
field1,field2

$ cat file.csv | body sort -nr -t, -k2,2
field1,field2
a,2
b,1

虽然不是很好的例子,但它展示了标题栏保持在顶部。

经过几分钟的谷歌和搜索stackoverflow,没有找到任何信息。

有人能够找到或重构这样的功能吗?


2
LOL。"Minutes of googling..." 微波社会多么快节奏啊? :) - Jonathan M
1
“文件头”是什么意思?这取决于文件类型,因为不同的文件类型有不同的文件头。也许您需要使用“head”程序,它可以输出文件的前几行内容? - evil otto
1
你有那个 在stackoverflow的链接 吗? - anubhava
@evilotto:是的,标题是第一行。不,我不想要头部。如果我确切地知道我想要什么,我就会直接写出来。我找到了一个神奇而快乐的脚本,它回显了第一行(可能是到stderr?),然后将其余部分传递给了下一个(可能是到stdout)。它在stackoverflow上某个地方。因为它对我来说只是起作用,所以我忘记了它是如何工作的。 - dfrankow
@anubhava 如果我有链接,我就不会问这个问题了。 - dfrankow
3个回答

8
这里有一种方法可以让你获取头部,然后获取CSV文件的其余部分,并进行排序(或者任何其他你想对数据做的操作),然后所有内容都会保存到outpipe中。
head -1 file.csv > outpipe | tail -n+2 file.csv | sort >> outpipe

编辑:

如果那种方法对你不起作用,你可以尝试像这个以前的讨论中的答案一样。


我之前已经尝试澄清了:我不仅需要尾部。它会将第一行和剩余部分分开,将剩余部分提交到管道中,然后将第一行和剩余部分重新组合在一起进行输出。 - dfrankow
2
也许像这个问题(http://unix.stackexchange.com/questions/11856/sort-but-keep-header-line-in-the-at-the-top)能够指引你正确的方向,如果你不想在这里使用`tail`。 - summea
1
就是这样!太棒了!它在StackExchange上,而不是StackOverflow上。如果您将其提交为答案,我会接受它。 - dfrankow
编辑后包括之前的讨论。我仍然认为串联tail可能是另一种完成此操作的方法...如果您添加了sort等。但很高兴其他方法对你起作用。 - summea
1
只是一个警告,请注意,函数体创建了其自己的子进程,因此将其作为ps命令的管道使用会产生额外的输出。 - anubhava
显示剩余2条评论

3

@summea找到了我所寻求的答案:Bash的body函数来自这里

# print the header (the first line of input)
# and then run the specified command on the body (the rest of the input)
# use it in a pipeline, e.g. ps | body grep somepattern
body() {
    IFS= read -r header
    printf '%s\n' "$header"
    "$@"
}

2
基础是从文件中重建out.file:
(head -n1 file; tail -n+2 file) > out.file

您需要对第二部分进行某种操作:
(head -n1 file; tail -n+2 file | voodoo -zack -peng) > out.file

太棒了。我不知道你可以像那样分组两个命令的输出。谢谢! - John Oxley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接