csvファイルがあるので、より小さなファイルに分割する必要があります。 Split -l 20000 test.csv 問題ありません。私の問題は、ファイルに別のヘッダーが含まれていることです。たとえば、+-1000行ごとに分割したいのですが、給与見出しの後に分割し、新しいファイルをcustヘッダーで始める必要があります。
顧客ヘッダー,xxx,xxxxxx,xxxxxx txn ヘッダー,xxxx,xxx,,xxxx,xxxxx,,xxx 詳細タイトル、xxxx、xxxx、xxxxxx、xxxx、xxxx 詳細タイトル,xxxxxxxx,xxxxxxxxxx,xxx,, 支払名、、、、、、xxxx、xxxxx 顧客ヘッダー,xxx,xxxxxx,xxxxxx txn ヘッダー,xxxx,xxx,,xxxx,xxxxx,,xxx 詳細タイトル、xxxx、xxxx、xxxxxx、xxxx、xxxx 支払名、、、、、、xxxx、xxxxx 顧客ヘッダー,xxx,xxxxxx,xxxxxx txn ヘッダー,xxxx,xxx,,xxxx,xxxxx,,xxx 詳細タイトル、xxxx、xxxx、xxxxxx、xxxx、xxxx 支払名、、、、、、xxxx、xxxxx
答え1
あなたはこれを行うことができますawk
:
awk -vfilename=output -vcut=1000 '
BEGIN { nl=0; nf=1; f=filename "." nf;}
++nl >= cut && /^cust header,/ {
close(f); nl=0; f=filename "." ++nf}
{print > f}' < file
数が(ここでは1000)より大きく、cut
現在の行で終わると表示される行数を記録しますcust header,
。出力ファイル名はoutput.1
、、、output.2
...(filename
変数)です。
答え2
ilkkachuの解決策はきれいで単一の実行可能ファイルを使用し、おそらく正解です。しかし、awk
私が最初に答えなかったら、私が選んだかもしれませんcsplit
。 csplit
以下に基づいてテキストファイルを分割します。コンテキストライン(まあ、正規表現)。その後、既知のユーティリティを使用してその出力を取得し、split
ファイルをさらに分割できます。
$ csplit --prefix="MySplit." test.csv '/^cust header,/' '{*}'
0
174
134
134
これはブロックあたりのバイト数です(この例では無視します)。次に、各チャンクを繰り返して、MySplit
20kの要件にさらに分割します。
$ for i in MySplit.0*; do
split --additional-suffix=".$i" -l 20000 "$i"
done
たとえば、-l 2
20kの代わりに使用すると、特定のサンプルの最終出力は次のようになります(拡張子でソート)。
$ ls -lhXB
total 44K
-rw-r--r-- 1 hunteke hunteke 0 Jun 15 13:31 MySplit.00
-rw-r--r-- 1 hunteke hunteke 174 Jun 15 13:31 MySplit.01
-rw-r--r-- 1 hunteke hunteke 67 Jun 15 13:27 xaa.MySplit.01
-rw-r--r-- 1 hunteke hunteke 81 Jun 15 13:27 xab.MySplit.01
-rw-r--r-- 1 hunteke hunteke 26 Jun 15 13:27 xac.MySplit.01
-rw-r--r-- 1 hunteke hunteke 134 Jun 15 13:31 MySplit.02
-rw-r--r-- 1 hunteke hunteke 67 Jun 15 13:27 xaa.MySplit.02
-rw-r--r-- 1 hunteke hunteke 67 Jun 15 13:27 xab.MySplit.02
-rw-r--r-- 1 hunteke hunteke 134 Jun 15 13:31 MySplit.03
-rw-r--r-- 1 hunteke hunteke 67 Jun 15 13:27 xaa.MySplit.03
-rw-r--r-- 1 hunteke hunteke 67 Jun 15 13:27 xab.MySplit.03
-rw-r--r-- 2 hunteke hunteke 442 Jun 15 13:06 test.csv