如何使用awk从文本文件中提取特定行?

时间:2012-06-18 12:45:21

标签: 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

请提出任何建议。

5 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分: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

答案 3 :(得分:0)

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

编辑:针对OP的编辑进行了更新

答案 4 :(得分:0)

如果HB不是在表格数据之前发送的唯一标题,并且您打算省略这些数据块(您没有完全指定要求),则必须使用一个触发器,记住你现在是否想要保留的块:

awk '/^[^ 0-9]/ {inblock=0}; /^[BH]/ {inblock=1}; { if (inblock) print }' d.txt
相关问题