パターンの始まりと終わりの間に興味のあるレコード(何百万ものレコード)がある次のファイルがあります。開始パターンは常にAで始まり、終了パターンは常にZで始まります。
Apattern1 somethinghere #start of pattern always starts with A
Line-of-data-here-aaa
Line-of-data-here-xxxxx
Zpattern1 #end of pattern always starts with Z
ApatternX somethinghere #Repeat: start of pattern always starts with A
Line-of-data-here-bbbb
Line-of-data-here-yyyy
Line-of-data-here-nnnnn
ZpatternX
パターン内の行に開始パターン(全行)を追加してデータを変換しようとしています。終了パターンを削除したいです。 sedおよび/またはawkを使用して、パターンの先頭(Aで始まる)の行をパターン内の行(Lで始まる)に追加し、パターンの終わり(常にZで始まる)を削除しようとします。データファイルは次のとおりです。
Apattern1 somethinghere Line-of-data-here-aaa
Apattern1 somethinghere Line-of-data-here-xxxxx
ApatternX somethinghere Line-of-data-here-bbbb
ApatternX somethinghere Line-of-data-here-yyyy
ApatternX somethinghere Line-of-data-here-nnnnn
答え1
あなたの質問を理解する限り、あなたが求めるものは次のとおりです。
sed -E '/^A/h;/^[AZ]/d;G;s/(.*)\n(.*)/\2 \1/' yourfile
したがって、orで始まる行はA
予約済みスペース()にコピーされ、orで始まる行は印刷する必要がないため/^A/h
削除されます()。他のすべての行の場合、その行の予約済みスペースが追加され()、2つの部分は改行文字()の代わりにスペースに置き換えられます。A
Z
/^[AZ]/d
A
G
s/(.*)\n(.*)/\2 \1/
sed
(私自身の拡張は簡単です。\h
交換時にバッファの内容を維持するために拡張することです。
sed -E '/^A/h;/^[AZ]/d;G;s/^/\h /' yourfile
このような問題がさらに発生した場合は、マージ要求を送信します。 )
答え2
sed -e '
/^A/,/^Z/!d
//{h;d;}
G;s/\(.*\)\n\(.*\)/\2\t\1/
' yourfile
結果:
Apattern1 somethinghere Line-of-data-here-aaa
Apattern1 somethinghere Line-of-data-here-xxxxx
ApatternX somethinghere Line-of-data-here-bbbb
ApatternX somethinghere Line-of-data-here-yyyy
ApatternX somethinghere Line-of-data-here-nnnnn
説明する
- 誤った範囲を拒否して正しい範囲を選択してください: '/^A/,/^Z/!d'
- 予約済みスペースに範囲境界を保存します。
- 範囲内で現在の行に keep を追加し、\n をタブに反転して変更します。