0

次のようなファイルがあるとします。

101 abcd <time>
106 efgh <time>
107 ijkl <time>
110 pqrs <time>
105 trsf <time>
101 yrte <time>
109 tyti <time>
110 tyui <time>

101 から始まり 110 で終わる行のチャンクに対していくつかの操作を実行したいと考えています。ファイル内に 101 と 110 が 1 つしかない場合は解決できます。

sed -ne 's/101/,/110/p' file1 > file2

このコマンドを使用すると、作業したい行のチャンクを取り出すことができます。最初のチャンクを最初のファイルに保存し、2番目に一致した行を2番目のファイルに保存できるロジックを見つけるのを手伝ってください。

私はAIXでスクリプトを書いています。

4

2 に答える 2

1

あなたがすることができます:

awk '/^101/ && !i { c++; i=1 } i { print > "file" c } /^110/ { i=0 }' input

cこれは、行が一致するたびにカウンター ( ) を単純にインクリメントします^101が、印刷中のブロックにない場合のみです。i2 番目の句は、必要に応じて名前にカウンターを含む出力ファイルに出力し、3 番目の句は、現在の行が出力対象のブロック内にあるかどうかを判断するために使用されるフラグ ( ) をオフにします。

別のオプションは、単に行うことです:

awk '/^101/,/^110/{ print > "output" c } /^110/{c++}' c=1 input
于 2013-02-14T21:01:52.017 に答える
0

あなたはawkで試すことができます.これはその仕事をするための短いワンライナーです:

awk '/101/{++i;f=1} f{print $0>"file"i} /110/{f=0}' file

あなたの例でテストしてください:

kent$  echo "101 abcd <time>
106 efgh <time>
107 ijkl <time>
110 pqrs <time>
105 trsf <time>
101 yrte <time>
109 tyti <time>
110 tyui <time>"|awk '/101/{++i;f=1} f{print $0>"file"i} /110/{f=0}'

kent$  head *
==> file1 <==
101 abcd <time>
106 efgh <time>
107 ijkl <time>
110 pqrs <time>

==> file2 <==
101 yrte <time>
109 tyti <time>
110 tyui <time>
于 2013-02-14T21:07:28.050 に答える