2015-01-07 65 views
0

希望您能在我的一項要求中闡明一些內容。假設我有以下條目的文件:使用多種圖案顯示多行

 
ABC 123 
XYZ 789 
XYZ 456 
ABC 234 
XYZ 789 
ABC 567 
XYZ 789 
XYZ 678 
XYZ 123 

基本上,我有ABC行,其後有X個XYZ行。每個ABC中的XYZ記錄數量從1到多個不等。

我需要一個shell腳本,它將根據第二列中的模式輸出ABC和相應的XYZ。

例如,顯示ABC紀錄圖案567與圖案678

相應的XYZ記錄的輸出只能是:

 
ABC 567 
XYZ 678 
+0

你要搜索ABC和567(舉例)從字面上? –

+0

不應該爲567的查詢找到以下所有三條XYZ線,而不僅僅是中間線? –

回答

0

試試這個,如果你的作品。我希望我理解您的要求正確:

awk -v p1='ABC 567' -v p2='XYZ 678' 
     '$0~p1{t=1;print;next}/^ABC/{t=0}$0~p2&&t' file 
+0

嗨肯特,我忘了提及,我有一個長長的模式列表運行 – Ravenwolf

0

爲了解決這個問題,我用awk將數據修改成一條線,然後grep上輸出,然後sed回覆匹配的條目原來的格式。

awk '{ printf ($1 == "ABC" ? "\n" : " @¶@ ") $0 }' file |grep 567 |sed 's/ @¶@ /\n/g' 

代碼走查:

  • 我用@¶@作爲分隔符。使用一些不會在數據中產生衝突的東西(否則你將不得不處理轉義)。另請注意,您的UTF8支持里程可能會有所不同。
  • awk版畫,沒有尾隨換行符,兩件事情連接在一起:
    • 如果我們上線ABC,換行符(\n)。否則,分隔符(@¶@)。
    • 那麼現有的線($0
  • grep然後運行您的查詢。這允許您使用-f FILE_OF_PATTERNS-e PATTERN小號
  • sed集合然後恢復分隔符回原來的格式

這有一行去一行的優勢。如果你在單個ABC中有成千上萬的XYZ,它會稍微慢一些,但這並不能保留任何內存,所以這應該是可擴展的。

這裏是上述awk命令的輸出(是的,有一個領先的空行,這並不重要):

$ awk '{ printf ($1 == "ABC" ? "\n" : " @¶@ ") $0 }' file 

ABC 123 @¶@ XYZ 789 @¶@ XYZ 456 
ABC 234 @¶@ XYZ 789 
ABC 567 @¶@ XYZ 789 @¶@ XYZ 678 @¶@ XYZ 123