
問題は、元のファイルに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)
-true
3行目ごとに計算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.txt
file2.txt
file3.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
。