2014-02-27 39 views
0

我有這樣的grep的:如何保存grep匹配的行?

INPUT hello.txt 
OUTPUT stack.txt 
INPUT stack.txt 
OUTPUT hello.txt 
INPUT overflow.txt 
OUTPUT overflow.txt 
OUTPUT byebye.txt 
INPUT byebye.txt 
INPUT nick.txt 
OUTPUT jesus.txt 

特輸出將是::

iarr

INPUT hello.txt 
INPUT stack.txt 
INPUT overflow.txt 
INPUT byebye.txt 
INPUT nick.txt 

oarr

iarr=`grep -Poh '.*INPUT' file.txt` 
oarr=`grep -Poh '.*OUTPUT' file.txt` 
與此內容file.txt的的

所以

OUTPUT stack.txt 
OUTPUT hello.txt 
OUTPUT overflow.txt 
OUTPUT byebye.txt 
OUTPUT jesus.txt 

很好,但我想知道文件名,我需要在輸入會有怎樣的輸出,我的意思是:

  • 如果輸入文件具有行的(同一個文件)的輸出實際行的波紋管,那麼這個項目將從oarr中刪除。
  • 如果一個OUTPUT文件在實際行的上方有一行INPUT(同一個文件),那麼這個項目將從iarr中刪除。

有了這些條件,其結果必然是以下幾點:

iarr

INPUT hello.txt 
INPUT overflow.txt 
INPUT nick.txt 

oarr

OUTPUT stack.txt 
OUTPUT byebye.txt 
OUTPUT jesus.txt 

我想要得到這樣的結果,但我不」不知道如何在grep命令中存儲正則表達式的特定匹配行...這是我想要解決的問題,你有另一個想法來做到這一點嗎? 可能會逐行閱讀......

+0

根據您的要求,我不明白您的輸出。 「byebye」在兩個陣列中都有相同的索引。爲什麼從iarr中刪除? –

回答

1

如果我很好地理解您的問題,您只需要每個文件名的首次出現。你可以做到這一點用awk:因此

awk '!x[$2]++' file.txt 

會給

INPUT hello.txt 
OUTPUT stack.txt 
INPUT overflow.txt 
OUTPUT byebye.txt 
INPUT nick.txt 
OUTPUT jesus.txt 

上,你可以繼續你的處理。

+0

@JohnDoe在你的問題窗口粘貼代碼不在這裏。另外爲什麼必須使用複雜的正則表達式?當簡單的'awk'完成同樣的事情時。 –

+0

謝謝@ JKB編輯的問題。請再閱讀一次。 – harrison4

+0

@JohnDoe再次讀到你的問題,但我認爲你不知道你的要求是什麼。爲什麼如果'awk'做你的工作,試着混合'grep'和'awk'。 –