[英]Split single column of csv horizontally in bash into multiple smaller csv files in BASH
我正在使用bash,並且在csv中只有一列 (不是行) ,沒有標題-samplefile.csv
111
222
333
444
555
666
777
888
在這種情況下,我想將其拆分為(說)2個4行和單個列的 csv文件(如果奇數說9行,那么5和4)帶有數據的csv文件
output1.csv(1列4行)
111
222
333
444
和output2.csv(1列4行)
555
666
777
888
Csplit不會創建csv文件,如下所示: 將文件拆分為x個文件,文件名已編號
有什么建議么?
使用awk
嘗試使用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
說明:
模數運算符是此處的關鍵,我們要在每四行之后分割輸入行:
$ awk '{print NR%4,$0}' file
1 111
2 222
3 333
0 444
1 555
2 666
3 777
0 888
當然,模數(余數)為四分之四為零,因此我們利用這一事實來增加文件計數器。 !(NR%4)
是NR%4==0
簡寫,因為當我們希望執行塊{i++}
時,零評估為false,而NR%4
為零,因此我們將其否定。
$ 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
您在尋找什么只是帶有-n
選項的split命令
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
這對我有用。 我在excel中打開了生成的csv,並且其格式正確。 我還沒有弄清楚如何刪除結尾的逗號,但是根據許多csv格式定義,這似乎可以接受。 第一個xargs調用將逗號添加到文件的每一行。 第二個xargs一起批處理四個。 如果將其重定向到文件(> 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,
我可以使用split
命令。
n =
awk 'END{print int(NR/2)}' file_name
&& split -l $ n file_name
cat output1
111
222
333
444
cat output2
555
666
777
888
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.