1

我有一个看起来像这样的文本文件。

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

请有任何建议。

4

5 回答 5

1

忽略B输出中的空行(您的问题规范没有说明为什么该空行出现在输出中,所以我假设它不应该存在):

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

将打印以开头的所有行以及以B开头的每一行H以及接下来的两行。

于 2012-06-18T19:14:09.397 回答
1
awk '/^[BH]/ || /^[[:blank:]]*[[:digit:]]/' inputfile
于 2012-06-18T12:54:58.923 回答
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
于 2012-06-19T04:49:41.517 回答
0
cat filename.txt | awk '/^[B(H(^ .*$){2})].*$/' > output.txt

编辑:更新了 OP 的编辑

于 2012-06-18T12:54:21.517 回答
0

如果H并且B不是在表格数据之前发送的唯一标头,并且您打算省略这些数据块(您没有完全指定要求),您必须使用触发器来记住您当前是否处于阻止您是否要保留:

awk '/^[^ 0-9]/ {inblock=0}; /^[BH]/ {inblock=1}; { if (inblock) print }' d.txt
于 2012-06-18T13:18:58.673 回答