我有一个看起来像这样的文本文件。
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
请提出任何建议。
答案 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)
如果H
和B
不是在表格数据之前发送的唯一标题,并且您打算省略这些数据块(您没有完全指定要求),则必须使用一个触发器,记住你现在是否想要保留的块:
awk '/^[^ 0-9]/ {inblock=0}; /^[BH]/ {inblock=1}; { if (inblock) print }' d.txt