2016-05-26 110 views
1

我有包含多行的數據。一些行以值1000.0,500.0,300.0開始,並且在這些行之間還有其他行。我要的是:特定行的打印

  • 打印該行只是包含1000.0
  • 行後跟一行含500.0
  • 其次是排含後300.0

一個典型的數據看起來像連接(圖像)enter image description here

1000.0 -13                
    969.0     306.9 356.7 309.9 
    850.0     305.0 324.9 306.2 
    700.0     309.1 315.3 309.4 
    500.0     318.9   318.9 
    400.0     331.4   331.4 
    300.0     344.2   344.2 

和期望的輸出是:

969.0     306.9 356.7 309.9 
    500.0     318.9   318.9 
    300.0     344.2   344.2 

數據模式有這樣幾行。

我曾嘗試爲

egrep -R "`grep -A1 "1000.0" file |awk '{print $1}'`|500.0|300.0" file 

它出了結果:參數列表太長請查看一下,建議最好的解決方案!

回答

1

你不說如何處理鍵值的重複出現,或者500.0和300.0是否按照該順序發生,所以這可能是也可能不是你真正想要的,但它適用於發佈的示例輸入和什麼你告訴我們,到目前爲止:

$ cat tst.awk 
f == 1    { print; f=2 } 
$1 == "1000.0"  { f=1 } 
f && $1 == "500.0" { print } 
f && $1 == "300.0" { print; f=0 } 

$ awk -f tst.awk file 
    969.0     306.9 356.7 309.9 
    500.0     318.9   318.9 
    300.0     344.2   344.2 

爲了處理註釋的新要求43520(未經測試):

$1 == "43520"  { s = $0 } 
f == 1    { print s ORS $0; f=2 } 
$1 == "1000.0"  { f=1 } 
f && $1 == "500.0" { print } 
f && $1 == "300.0" { print; f=0 } 
+0

確實值的發生順序。我的意思是這種模式有幾種類型。此外,有些時候缺少1000.0,但存在500.0和300.0,那麼我們需要忽略這些值並轉到1000.0,500.0,300.0一起出現的下一個模式。我檢查了輸出,它看起來像我想要的那樣工作! – nee2bbs

+0

是的,考慮到這些要求,它將完全按照您的要求進行。 –

+0

與前面的情況一樣,如果在1000.0之前有一行之前有一行以43250開始,我們也想包含該行,而其餘行與舊行相同,那麼awk腳本需要進行哪些修改。結果將如下所示: 打印包含行的行43520 在包含1000.0的行之後打印行 後面接着一行包含500.0 後面接着一行包含300.0 – nee2bbs

0

一個grep唯一的解決辦法:

grep -A1 "1000.0" file | grep -v "1000.0" && grep -E '500.0|300.0' file 

希望它有幫助。