特定のパターンで行の順序を変更しようとしています。多くの行(例:99行)を持つファイルの操作。 3行ごとに、2行目を3行目、3行目を2行目とします。
例。
1-入力:
gi_1234
My cat is blue.
I have a cat.
gi_5678
My dog is orange.
I also have a dog.
...
2-出力:
gi_1234
I have a cat.
My cat is blue.
gi_5678
I also have a dog.
My dog is orange.
...
awk
と整数演算を使用する:
awk 'NR%3 == 1 { print } NR%3 == 2 { delay=$0 } NR%3 == 0 { print; print delay; delay=""} END { if(length(delay) != 0 ) { print delay } }' /path/to/input
モジュラス演算子は整数除算を実行し、余りを返すため、各行について、シーケンス1、2、0、1、2、0 [...]を返します。それを知って、後でモジュラスが2である行に入力を保存します。つまり、入力がゼロのときに入力を印刷した直後です。
$ seq 9 | sed -n 'p;n;h;n;G;p'
1
3
2
4
6
5
7
9
8
つまり、現在の行をp
rint、n
extを取得し、h
oldを取得し、n
extを取得し、G
et保留行を取得します(パターンスペースに追加します)およびp
rint 3行目と2行目を入れ替えた2行のパターンスペース。
別のawkアプローチ:
awk '{print $0; if ((getline L2)>0 && (getline L3)>0){ print L3 ORS L2 }}' file
出力:
gi_1234
I have a cat.
My cat is blue.
gi_5678
I also have a dog.
My dog is orange.
(getline L2)>0 && (getline L3)>0
-次の2レコードが存在する場合、それらを抽出します
2番目と3番目の各レコードは、それぞれL2
変数とL3
変数に割り当てられます
1つの方法は次のとおりです。
sed -e '
/\n/s/\(.*\)\(\n\)\(.*\)/\3\2\1/;//b
$!N;$q;N; # load up the pattern space with 3 lines provided eof not reached
P;D; # first just print the first line then interchange the two and print them
' yourfile
または、
Perl -ne 'print $_, reverse scalar <>, scalar <>' yourfile
gi_1234
I have a cat.
My cat is blue.
gi_5678
I also have a dog.
My dog is orange.
長いファイルには適していませんが、ファイルを編集するだけで、たとえば、いくつかのyamlスタンザを並べ替えたい場合に便利です。
最初にマクロを記録します。
gg qq j ddp j q
そして、必要な回数繰り返します:
@q @q @q ...
または単に。
3@q
説明:
使用法:./shuffle_lines.awk input.txt
シバンをチェック#!/usr/bin/awk -f
、awk
の場所はシステムによって異なる場合があるためです。
#!/usr/bin/awk -f
{
if ((NR + 1) % 3 == 0) {
buffer = $0;
} else if (NR % 3 == 0) {
print $0 ORS buffer;
buffer = "";
} else {
print;
}
}