2013-04-09 80 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)。

相關問題