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の後の2行を抽出する必要があります。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
awk '/^[BH]/ || /^[[:blank:]]*[[:digit:]]/' inputfile
于 2012-06-18T12:54:58.923 に答える
1

出力の後の空白行を無視しBます(問題の仕様では、その空白行が出力に含まれる理由が示されていないため、そこにあるべきではないと想定しています):

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

Bで始まるすべての行と、で始まる各行がH次の2行とともに印刷されます。

于 2012-06-18T19:14:09.397 に答える
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

H表形式のデータの前に送信されるヘッダーがandだけではなく、それらのデータブロックを省略したい場合B(要件を完全に指定していません)、フリップフロップを使用して、現在保持するかどうかをブロックする:

awk '/^[^ 0-9]/ {inblock=0}; /^[BH]/ {inblock=1}; { if (inblock) print }' d.txt
于 2012-06-18T13:18:58.673 に答える
0
cat filename.txt | awk '/^[B(H(^ .*$){2})].*$/' > output.txt

編集:OPの編集用に更新

于 2012-06-18T12:54:21.517 に答える