awkを使用して行(レコード)を分割する方法は? [閉鎖]

awkを使用して行(レコード)を分割する方法は? [閉鎖]

文書:

data
A B
C D
data
E F
G H
data
I J
K L
M N

望ましい結果:

I J
K L
M N

「データ」に分割する方法は?私はawkの使用方法を検索しましたが、ほとんどの相対awkは列を分割します。

答え1

レコード区切り記号として使用dataし、最後のレコードを印刷します。

$ awk -v RS=data 'END{print}' File

I J
K L
M N

複数文字の値をサポートするには、GNU awk(gawk)やmawkなどのawkが必要ですRS

答え2

$ awk '/^data/ { lines = ""; next } { lines = (lines == "" ? $0 : lines ORS $0) } END { print lines }' file
I J
K L
M N

awkこれは、文字列で始まる最後の行以降の入力を取得するために使用されますdata。これは各行を変数に保存することによってlines行われます。この変数は、data次から始まる行が現れるたびに消去されます。入力が終了すると、変数の値が印刷されます。


使用sed:

$ sed -n 'H;${ x; s/.*\ndata\n//p; }' file
I J
K L
M N

予約済みスペースにすべての行を追加します。最後の行に出会うと、予約済みスペースがパターンスペースに置き換えられ、文字列dataの前のすべてのエントリ(両側に改行文字を含む)が削除され、残りのビットが印刷されます。


使用ed:

$ printf "?^data?ka\n1,'ad\n,p\nQ\n" | ed -s file
I J
K L
M N

または、

ed -s file <<END_ED
?^data?ka
1,'ad
,p
Q
END_ED

dataここでは、最初に行の先頭で最後に表示される文字列を逆方向に検索し、その行にラベルを追加します(これをラベルと呼びますa)。その後、バッファの先頭から示された行まで削除します。,pバッファの内容全体を出力するだけです。

GNUでない場合は、ed最後(保存せずに終了)が不要になる可能性があります。Q

答え3

改行の代わりに「データ」にレコードを分割するには、RS(レコード区切り記号)変数を設定します。

4番目のレコード(最初のレコードは最初の「データ」の前にあり、空)にのみ興味があるため、NRが4の場合にのみ印刷されます。

cat file | awk 'BEGIN {RS="data\n"}; NR==4 {print}'

答え4

次のコマンドを使用して素晴らしい結果を得ました。

tac file.txt|sed -n '1,/data/p'| tac| sed -n '2,$p'

出力

 I J
 K L
 M N

関連情報