2012-06-18 147 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 
相关问题