web-dev-qa-db-ja.com

ファイルの行の順序を変更する

特定のパターンで行の順序を変更しようとしています。多くの行(例: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.
...
11
Annick Raymond

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である行に入力を保存します。つまり、入力がゼロのときに入力を印刷した直後です。

12
DopeGhoti
$ seq 9 | sed -n 'p;n;h;n;G;p'
1
3
2
4
6
5
7
9
8

つまり、現在の行をprint、nextを取得し、holdを取得し、nextを取得し、Get保留行を取得します(パターンスペースに追加します)およびprint 3行目と2行目を入れ替えた2行のパターンスペース。

23

別の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変数に割り当てられます

3
RomanPerekhrest

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.
1
user218374

Vim

長いファイルには適していませんが、ファイルを編集するだけで、たとえば、いくつかのyamlスタンザを並べ替えたい場合に便利です。

最初にマクロを記録します。

gg qq j ddp j q

そして、必要な回数繰り返します:

@q @q @q ...

または単に。

3@q

説明:

  • gg-最初の行に移動
  • qq-マクロの記録を開始する
  • j-2行目に移動
  • ddp-2行目と3行目を入れ替えます
  • j-4行目に移動します。つまり、次の3行の最初の行に移動します
  • q-記録を停止
  • @q-マクロを1回再生する
  • 3 @ q-マクロを3回再生します
1
Edheldil

使用法:./shuffle_lines.awk input.txt

シバンをチェック#!/usr/bin/awk -fawkの場所はシステムによって異なる場合があるためです。

#!/usr/bin/awk -f

{
    if ((NR + 1) % 3 == 0) {
        buffer = $0;
    } else if (NR % 3 == 0) {
        print $0 ORS buffer;
        buffer = "";
    } else {
        print;
    }
}
0
MiniMax