2013-04-09 68 views
3

我大量使用管道多个Linux shell命令,例如:在外壳绕过文件头通用解决方案命令

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

我的文件通常有一个标题行,我经常要保持它在整个管道。所以,例如,我希望grep,sed和从第2行开始排序,同时保持第一行不变。

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

也许是这样的:

enter image description here

(箭头是图像中的管道)

,但我不知道怎么去,要在zshell工作,或者如果它甚至有可能。一个问题是我需要在两个管道上使用命令来跟踪第一个管道分裂。

任何创意解决方案?

+1

我不确定abouth zsh,但用bash可以使用'(head -2 file1; tail -n +3 file1 | grep BLAH | sed's/old/new /'| sort -k 1,1 )> file3' – 2013-04-09 04:39:56

+1

@Vaughn你似乎已经考虑了两行标题。你可能意思是'(头-n +1等等;尾-n +2等等| sed's/old/new'| sort -k 1,1)> outfile' – devnull 2013-04-09 07:04:41

+0

@devnull:你是对的。我习惯于使用两个标题行来处理文件,只是没有想到地使用它。 – 2013-04-09 11:35:17

回答

2

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

注:

  • 如果壳支持{ }它优于在这种情况下,因为它不会产生一个子外壳的()构建体(有时是希望具有子外壳,虽然)。
  • head -2已过时,你应该使用-n参数一样head -n 2
  • 可以跳过tail -n +2 file1的一部分,如果你绝对知道你是grepping为不能在你的标题中发现了什么,但可以肯定的是这种方式更清洁。

这应该适用于最新的shell,btw(bash,ksh,zsh)。

相关问题