0

2 つのパターンに一致する行を正常に出力する sed コマンドがあります。

 sed -n '/PAGE 2/,/\x0c/p' filename.txt

私が理解していないのは、最初のトークンから2番目のトークンまでのすべての行を印刷したいということです。トークンは大きなフラット ファイルのレコード セパレータであり、その\x0c行をそのままにしておく必要があります。

2 つのトークンの間では、データは完全に可変であり、信頼できるアンカーがありません。

[明確化] 現時点では、/PAGE 2/と を/\x0c/含むすべての行が出力されます。次のレコード /PAGE 2/まで印刷したい。/\x0c/

[テストデータ]/x0cは、このレコードの最初の行の先頭と最後の行の先頭になります。

次のレコードの開始直前の行まで、レコードの最初の行を削除する必要があります。

^L20-SEP-2006 01:54:08 PM         Foobars College                          PAGE 2
TERM: 200610               Student Billing Statement                     SUMDATA
99999

Foo bar                                                              R0000000
999 Geese Rural Drive                                           DUE: 15-OCT-2012
Columbus, NE 90210

--------------------------------------------------------------------------------
       Balance equal to or greater than $5000.00    $200.00
       Billing inquiries may be directed to 444/555-1212 or by
       email to bursar@foobar.edu.  Financial Aid inquiries should
       be directed to 444/555-1212 or finaid@foobar.edu.
^L20-SEP-2006 01:54:08 PM         Foobars College                          PAGE 1

[期待される結果]

 ^L20-SEP-2006 01:54:08 PM         Foobars College                          PAGE 1

ファイルにはそのようなレコードが複数あります。/PAGE 2/私はトークンとトークンだけに頼ることができ/x0c/ます。

[解決]:

Choruba の指示に従って、私は彼のコマンドを次のように編集しました。

sed '/PAGE [2-9]/,/\x0c/{/\x0c$/!d}'

中括弧内の規則は、 a を含むすべての行に適用され、^Lそれらを選択的に無視していました。

4

5 に答える 5

9

編集:OPが尋ねた新しい質問に対する新しい回答(レコードを削除する方法:

レコードを区切る control-Ls を持つファイルがあり、特定のレコードから特定の行を印刷したい場合は、レコード区切り記号を control-L に、フィールド区切り記号を "\n" に設定して、好きなものを印刷します。たとえば、OPが投稿した入力から望んでいると言う出力を取得するには、次のようにします。

awk -v RS='^L' -F'\n' 'NR==3{print $1}' file

ここに示す ^L はリテラルの control-L を表し、入力ファイルの最初の control-L の前に空のレコードがあるため、3 番目のレコードです。

#

これは、OP が尋ねた元の質問に対する回答です。

あなたはこれを求めている:

awk '/PAGE 2/ {f=1} /\x0c/{f=0} f' file

だけでなく、違いを確認するためにこれらも試してください(将来のために):

awk '/PAGE 2/ {f=1} f; /\x0c/{f=0}' file
awk 'f; /PAGE 2/ {f=1} /\x0c/{f=0}' file

そして最後に、参考までに、次のイディオムは、一致する特定のパターンを指定してレコードの範囲を選択する方法を説明しています。

a) いくつかのパターンからすべてのレコードを印刷します。

awk '/pattern/{f=1}f' file

b) いくつかのパターンの後にすべてのレコードを印刷します。

awk 'f;/pattern/{f=1}' file

c) いくつかのパターンの後に N 番目のレコードを出力します。

awk 'c&&!--c;/pattern/{c=N}' file

d) いくつかのパターンの後、N 番目のレコードを除くすべてのレコードを出力します。

awk 'c&&!--c{next}/pattern/{c=N}1' file

e) いくつかのパターンの後に N レコードを出力します。

awk 'c&&c--;/pattern/{c=N}' file

f) いくつかのパターンの後に N レコードを除くすべてのレコードを出力します。

awk 'c&&c--{next}/pattern/{c=N}1' file

g) いくつかのパターンから N レコードを出力します。

awk '/pattern/{c=N}c&&c--' file

変数名を "found" の "f" から "count" の "c" に変更したのは、変数が実際に何であるかをより表現できるようにするためです。

于 2012-11-01T13:21:13.110 に答える
3

文字sedを含む行を印刷しないように指示します。

sed -n '/PAGE 2/,/\x0c/{/\x0c/!p}' filename.txt
于 2012-11-01T13:14:21.730 に答える
1

これでうまくいくと思います:

awk '/PAGE 2/{a=1}/\x0c/{a=0}{if(a)print}'
于 2012-11-01T13:09:55.167 に答える
0

この行では、2 番目が最後の行 ( ) をsed削除 ( ) します。d$

sed -n '/^START$/,/^STOP$/p' in.txt | sed '$d'
于 2012-11-01T13:12:49.943 に答える