3つの重複行のうち2つを逆に置き換えます。

3つの重複行のうち2つを逆に置き換えます。

このようなtxtファイルがあります。

AAAAAAAAAA
BBBBBBBBBB
CCCCCCCC

DDDDDDDDDDD
EEEEEEEEEEE
FFFFFFFFFFF

GGGGGGGGGGG
HHHHHHHHHHH
IIIIIIIIIII

各グループには3つの行があり、間に改行があります。

ファイルが次のように見えるように、各グループの最初の2行を反転したいと思います。

BBBBBBBBBB
AAAAAAAAAA
CCCCCCCC

EEEEEEEEEEE
DDDDDDDDDDD
FFFFFFFFFFF

HHHHHHHHHHH
GGGGGGGGGGG
IIIIIIIIIII

端末でこれを行うにはどうすればよいですか?

編集:テキストファイルの例を次にアップロードしました。ここ答えをテストする必要がある場合。

答え1

$ cat -n ip.txt 
     1  AAAAAAAAAA
     2  BBBBBBBBBB
     3  CCCCCCCC
     4  
     5  DDDDDDDDDDD
     6  EEEEEEEEEEE
     7  FFFFFFFFFFF
     8  
     9  GGGGGGGGGGG
    10  HHHHHHHHHHH
    11  IIIIIIIIIII

固定形式なので、それに合わせてモジュロ演算子を使用してください。

$ awk 'NR%4==1{s=$0; next} 1; NR%4==2{print s}' ip.txt
BBBBBBBBBB
AAAAAAAAAA
CCCCCCCC

EEEEEEEEEEE
DDDDDDDDDDD
FFFFFFFFFFF

HHHHHHHHHHH
GGGGGGGGGGG
IIIIIIIIIII


興味深いperl正規表現バージョン

perl -00 -pe 's/(\N+\n)(\N+\n)/$2$1/' ip.txt
  • -00awkに似た短絡モード-v RS=
  • その後、最初の2行を置き換えます。
    • また、使用可能(\N+\n)((?1))- 複雑な正規表現を繰り返す必要がある場合に便利です。

答え2

一方向 - GNU awkを使用する:

gawk 'BEGIN{RS=""; OFS=FS="\n"} {tmp = $2; $2 = $1; $1 = tmp; ORS=RT} 1' file
BBBBBBBBBB
AAAAAAAAAA
CCCCCCCC

EEEEEEEEEEE
DDDDDDDDDDD
FFFFFFFFFFF

HHHHHHHHHHH
GGGGGGGGGGG
IIIIIIIIIII

答え3

sed -n 'h; n; G; N; p; n; p' input.txt

説明する

sed待機スペースとパターンスペースという2つのワークスペースがあります。彼らは2つの変数に等しい -var_1var_2。各入力ラインはパターン空間に入りますが、それらをコピー(予約済み空間のすべての項目を置き換える)または予約済み空間に追加できます。したがって:

  • h- パターンスペースを予約済みスペースにコピーします。今パターンスペースとホールドスペースの両方AAAAA
  • n- 次の入力ラインをパターン空間にインポートします。したがって、パターン空間は今BBBBB
  • G- 改行文字とkeepspace()の内容をAAAAAパターンスペースに追加して、パターンスペースが現在になるようにしますBBBBB\nAAAAA
  • N- パターン空間に改行文字と入力の次の行を追加します。 -BBBBB\nAAAAA\nCCCCC
  • p- パターンスペースを印刷します。
  • n- パターンスペースの次の入力行を取得し(存在する場合)、そうでない場合は終了します(ファイルの終わりに達した場合)。
  • p- パターンスペースを再印刷します。

出力

BBBBBBBBBB
AAAAAAAAAA
CCCCCCCC

EEEEEEEEEEE
DDDDDDDDDDD
FFFFFFFFFFF

HHHHHHHHHHH
GGGGGGGGGGG
IIIIIIIIIII

関連情報