【问题标题】:General solution for bypassing file headers in shell commands在 shell 命令中绕过文件头的通用解决方案
【发布时间】:2013-04-09 04:30:22
【问题描述】:

我广泛使用管道多个 linux shell 命令,例如:

grep BLAH file1 | sed 's/old/new/' | sort -k 1,1 > file3

我的文件通常有一个标题行,而且我经常必须在整个管道中保留它。因此,例如,我想从第 2 行开始进行 grep、sed 和排序,同时保持第 1 行不变。

我正在寻找一些通用的解决方案,给定一些命令会保留标题。我通常将标头写入管道之前的文件,然后在管道结束后将其返回。我已经开始使用 zshell,所以我想知道这是否有助于获得更简化的解决方案。

大概是这样的:

(图中箭头为管道)

但我不确定如何让它在 zshell 中工作,或者是否有可能。一个问题是我需要在两个管道上使用命令来跟进第一个管道拆分。

有什么创意解决方案吗?

【问题讨论】:

  • 我不确定h zsh,但是对于bash,您可以使用(head -2 file1;tail -n +3 file1 | grep BLAH | sed 's/old/new/' | sort -k 1,1) >file3
  • @Vaughn 您似乎考虑了 2 行标题。你的意思可能是(head -n +1 blah; tail -n +2 blah | sed 's/old/new' | sort -k 1,1) > outfile
  • @devnull:你是对的。我习惯于处理带有两个标题行的文件,只是不假思索地使用它。
  • +1 用于提供有用的图像来说明您的意图:-)

标签: linux shell zsh


【解决方案1】:

Vaughn 和 devnull 已经指导您找到解决方案。虽然它们都包含拼写错误,但我有一些评论要添加,并建议改用它:

{ head -n 1 file1; tail -n +2 file1 | grep BLAH | sed 's/old/new/' | sort -k 1,1; } >file3

它的作用是将file1 的第一行放在一个命令(您的标题)中,然后在文件其余部分的第二个命令中执行您的grep/sed/whatever 魔术(没有标题,tail -n +2)并重定向合并输出到file3

注意事项:

  • 如果您的 shell 支持 { },则在这种情况下,它比 ( ) 构造更可取,因为它不会生成子 shell(但有时需要子 shell)。
  • head -2 已弃用,您应该使用 -n 参数,如 head -n 2
  • 如果您绝对知道在您的标头中找不到您要搜索的内容,则可以跳过 tail -n +2 file1 部分,但这样肯定更干净。

这应该适用于最新的 shell,顺便说一句(bash、ksh、zsh)。

【讨论】:

    猜你喜欢
    • 2017-08-02
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多