0

私はbashを使用しており、ヘッダーのないcsvに単一の (行ではない)があります-samplefile.csv

111 
222 
333 
444 
555 
666 
777 
888

これを (たとえば) 2 つの csv ファイル (この場合は4 行と 1 列) に分割しようとしています(奇数の場合は 9 行、次に 5 と 4) データを含む csv ファイル

output1.csv (1列4行)

111
222
333
444

および output2.csv (1 列 4 行)

555
666
777
888

ここに示すように Csplit は csv ファイルを作成しません ファイル名が番号付けされた x ファイルにファイルを分割します

助言がありますか?

4

4 に答える 4

3

これはawktryで簡単awk '{print $0 > ("output"i+1".csv")}!(NR%4){i++}' fileです。

デモ:

$ ls 
file

$ cat file 
111 
222 
333 
444 
555 
666 
777 
888

$ awk '{print $0 > ("output"i+1".csv")}!(NR%4){i++}' file

$ ls
file  output1.csv  output2.csv

$ cat output1.csv 
111 
222 
333 
444 

$ cat output2.csv 
555 
666 
777 
888

説明:

ここでモジュラス演算子が重要です。入力行を 4 行ごとに分割します。

$ awk '{print NR%4,$0}' file
1 111
2 222
3 333
0 444
1 555
2 666
3 777
0 888

4のモジュラス(剰余) は 4 ごとにゼロなので、この事実を使用してファイル カウンターをインクリメントします。as zero は false と評価され!(NR%4)、ブロックを実行したい場合はゼロなので、マイナスにします。NR%4==0NR%4{i++}

$ awk '{print NR%4,$0,"output"i+1".csv"}!(NR%4){i++}' file
1 111 output1.csv
2 222 output1.csv
3 333 output1.csv
0 444 output1.csv
1 555 output2.csv
2 666 output2.csv
3 777 output2.csv
0 888 output2.csv
于 2013-04-10T09:23:33.013 に答える
1

あなたが探しているのは、-nオプション付きの分割コマンドだけです

split -nl/2 input output

あなたのために仕事をします。

スプリットのマニュアルページから:

-n, --number=CHUNKS
              generate CHUNKS output files.  See below
 CHUNKS may be: N       split into N files based on size of input K/N     output Kth of N to stdout l/N     split into N  files  without  splitting  lines  l/K/N
       output Kth of N to stdout without splitting lines r/N     like 'l' but use round robin distribution r/K/N   likewise but only output Kth of N to stdout
于 2013-04-10T09:01:08.920 に答える
0

コマンドを使用できますsplit

n= awk 'END{print int(NR/2)}' file_name&& split -l $n ファイル名

cat output1
111
222
333
444


cat output2 
555
666
777
888
于 2013-04-10T07:51:49.127 に答える
0

これは私にとってはうまくいきました。結果のcsvをExcelで開いたところ、正しくフォーマットされていました。末尾のコンマを削除する方法はまだわかりませんが、多くの csv 形式の定義に基づいて許容できるようです。最初の xargs 呼び出しは、ファイルの各行にコンマを追加します。2 番目の xargs は、4 つをまとめてバッチ処理します。それをファイル(> new.csv)にリダイレクトすると、探しているものになる可能性があります。

>cat my.csv
111
222
333
444
555
666
777
888 
>cat my.csv | xargs -n 1 -i echo \{\}, | xargs -n 4 
111, 222, 333, 444,
555, 666, 777, 888,
于 2013-04-10T01:43:12.987 に答える