2012-06-18 188 views
1

我有一個看起來像這樣的文本文件。如何使用awk從文本文件中提取特定行?

A 102 
B 456 
C 678 
H A  B  C  D  E  F  G  H  I  J 
    1.18 0.20 0.23 0.05 1.89 0.72 0.11 0.49 0.31 1.45 
    3.23 0.06 2.67 1.96 0.76 0.97 0.84 0.77 0.39 1.08 

我需要提取所有以B,H和H後兩行開頭的行。我怎樣才能用awk做到這一點?

預期產出將是

B 456 
H A  B  C  D  E  F  G  H  I  J 
    1.18 0.20 0.23 0.05 1.89 0.72 0.11 0.49 0.31 1.45 
    3.23 0.06 2.67 1.96 0.76 0.97 0.84 0.77 0.39 1.08 

任何建議,請。

+1

的最後兩行中的輸出不符合B或H和啓動。您的輸出也有空行。請更清楚地說明您的要求。 – 2012-06-18 12:57:00

回答

1

忽略B後的空白行中的輸出(你的問題給出的規格沒有任何跡象表明,爲什麼是空行是在輸出,所以我假設它不應該存在):

awk '/^H/{t=3} /^B/ || t-- >0' input.file 

將打印以B開頭的所有行以及以H開頭的每行以及隨後的兩行。

+0

非常感謝。 – casey

0
cat filename.txt | awk '/^[B(H(^ .*$){2})].*$/' > output.txt 

編輯:更新了OP的編輯

1
awk '/^[BH]/ || /^[[:blank:]]*[[:digit:]]/' inputfile 
+0

這很好,但只適用於H和B是唯一可能表示開始表格數據的字段。它確實解決了OP對他/她最佳規格的要求。 –

+0

這不會打印最後2行數字 – cppcoder

+0

@cppcoder:嗯......它爲我做。 –

0

如果HB是不是之前的表格發送數據的只有頭和您要忽略那些數據塊(你不沒有完全說明要求),你必須使用觸發器來記住你是否在一個你想要保留的區塊中:

awk '/^[^ 0-9]/ {inblock=0}; /^[BH]/ {inblock=1}; { if (inblock) print }' d.txt 
1
bash-3.00$ cat t 
A 102 
B 456 
C 678 
H A  B  C  D  E  F  G  H  I  J 
    1.18 0.20 0.23 0.05 1.89 0.72 0.11 0.49 0.31 1.45 
    3.23 0.06 2.67 1.96 0.76 0.97 0.84 0.77 0.39 1.08 

bash-3.00$ awk '{if(($1 == "B") || ($1 == "H") || ($0 ~ /^ /)) print;}' t 
B 456 
H A  B  C  D  E  F  G  H  I  J 
    1.18 0.20 0.23 0.05 1.89 0.72 0.11 0.49 0.31 1.45 
    3.23 0.06 2.67 1.96 0.76 0.97 0.84 0.77 0.39 1.08 

或短

awk '{if($0 ~ /^[BH ]/) print;}' t 

,甚至更短的

awk '/^[BH ]/' t 
相關問題