このような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
-00
awkに似た短絡モード-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_1
とvar_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