結果:

結果:

パターンの始まりと終わりの間に興味のあるレコード(何百万ものレコード)がある次のファイルがあります。開始パターンは常に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つの部分は改行文字()の代わりにスペースに置き換えられます。AZ/^[AZ]/dAGs/(.*)\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 をタブに反転して変更します。

関連情報