4つのファイルのいずれかを一度に3行に分割できますか?

4つのファイルのいずれかを一度に3行に分割できますか?

問題は、元のファイルに0〜45行を含めることができますが、常に3に分割できることです。

コマンドを試しましたが、split -lファイルが生成されすぎました。誰かが私に正しい方向を伝えることを願っていますが、splitそうではありません。

15行のソースファイルの例:

lineAA|data|Format via FG|398
lineAB|data|Format via FG|398
lineAC|data|Format via FG|398
line_XA|data|Format via FG|398
line_XB|data|Format via FG|398
line_XC|data|Format via FG|398
line_ZA|data|Format via FG|398
line_ZB|data|Format via FG|398
line_ZC|data|Format via FG|398
line_XX|data|Format via FG|398
line_XY|data|Format via FG|398
line_XZ|data|Format via FG|398
line_FA|data|Format via FG|398
line_FB|data|Format via FG|398
line_FC|data|Format via FG|398
...

出力例:

ファイル1

    lineAA|data|Format via FG|398
    lineAB|data|Format via FG|398
    lineAC|data|Format via FG|398
    line_FA|data|Format via FG|398
    line_FB|data|Format via FG|398
    line_FC|data|Format via FG|398

ファイル-2

    line_XA|data|Format via FG|398
    line_XB|data|Format via FG|398
    line_XC|data|Format via FG|398

ファイル-3

    line_ZA|data|Format via FG|398
    line_ZB|data|Format via FG|398
    line_ZC|data|Format via FG|398

ファイル4

    line_XX|data|Format via FG|398
    line_XY|data|Format via FG|398
    line_XZ|data|Format via FG|398

答え1

アッ解決策:

awk 'BEGIN{ f=1 }!(NR%3){ n=NR+1 }NR==n{ f++ }
     { print > "STATUS_FILE-"f".txt" }!(NR%12){ f=0 }' file
  • BEGIN{ f=1 }- 初期ファイルインデックス番号の設定

  • !(NR%3)- true3行目ごとに計算

  • f++- 3行目ごとにファイルインデックス番号を増やします。

  • !(NR%12){ f=0 }- 12行目ごとにファイルインデックス番号をリセット(4部)

  • print > "STATUS_FILE-"f".txt"- 目的のファイルインデックス番号でファイルに行を印刷します。


結果を見る:

$ head STATUS_FILE*
==> STATUS_FILE-1.txt <==
lineAA|data|Format via FG|398
lineAB|data|Format via FG|398
lineAC|data|Format via FG|398
line_FA|data|Format via FG|398
line_FB|data|Format via FG|398
line_FC|data|Format via FG|398

==> STATUS_FILE-2.txt <==
line_XA|data|Format via FG|398
line_XB|data|Format via FG|398
line_XC|data|Format via FG|398

==> STATUS_FILE-3.txt <==
line_ZA|data|Format via FG|398
line_ZB|data|Format via FG|398
line_ZC|data|Format via FG|398

==> STATUS_FILE-4.txt <==
line_XX|data|Format via FG|398
line_XY|data|Format via FG|398
line_XZ|data|Format via FG|398

「独立」を創造するアッスクリプト:

split_on_4x3.awkスクリプト内容:

#!/bin/awk -f

BEGIN { f=1 }
!(NR%3) { n=NR+1 }
NR==n { f++ }
{ print > "STATUS_FILE-"f".txt" }
!(NR%12) { f=0 }

使用法:

awk -f split_on_4x3.awk inputfile

答え2

次に、一度に3行ずつグループにファイルを繰り返して、それぞれ、、、、file0.txtを作成します。複数行に分けましたが、1行だけ連結すれば1つに合わせることができます。file1.txtfile2.txtfile3.txt

awk '
    BEGIN { f=-1 }
    !( (NR-1) % 3) { f = (f+1) % 4 }
    { print > "file" f ".txt" }
' source.txt

このawkプログラムには3つのコマンドがあります。このBEGIN {}ブロックは、プログラムの開始時に最初の行を読み取る前に実行されます。各入力行は、残りの2つの命令に適用されます。最初は3つのグループで行を計算し(現在のNR行番号を保存します)、各グループの終わりにファイル番号を増やします。fファイル番号が4番目の項目に達すると、最初の項目にリセットされます。 (この計算とリセット方法はモジュロ演算子を使用します。%

答え3

splitマニュアルページで以下を使用したいようです。

NAME
     split -- split a file into pieces

SYNOPSIS
     split [-a suffix_length] [-b byte_count[k|m]] [-l line_count] [-p pattern] [file [name]]

DESCRIPTION
     The split utility reads the given file and breaks it up into files of 1000 lines each.  If
     file is a single dash (`-') or absent, split reads from the standard input.

     The options are as follows: [...]


     -l line_count
             Create smaller files n lines in length.

split bigfile -l3それぞれ3行を含む小さなファイルに分割されますbigfile

関連情報