将bash中的单列csv水平拆分为BASH中的多个较小的csv文件

时间:2013-04-10 01:14:01

标签: bash csv awk split

我正在使用bash,我在csv中有一个 (不是行),没有header- samplefile.csv

111 
222 
333 
444 
555 
666 
777 
888

我希望将此分成(例如)2个csv文件 4行和单个列,在这种情况下(如果奇数表示9行然后5和4)csv文件包含数据

output1.csv(1列4行)

111
222
333
444

和output2.csv(1列和4行)

555
666
777
888

Csplit不会创建csv文件,如下所示 split a file into x files where file names are numbered

有什么建议吗?

4 个答案:

答案 0 :(得分:3)

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的简写为零当我们希望块NR%4执行时,评估为false并且{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

答案 1 :(得分: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

答案 2 :(得分:0)

这对我有用。我在excel中打开了生成的csv并且格式正确。我还没有弄清楚如何删除尾随的逗号,但基于许多csv格式定义,这似乎是可以接受的。第一个xargs调用为文件的每一行添加一个逗号。第二个xargs将四个一起批处理。如果您将其重定向到文件(&gt; 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,

答案 3 :(得分:0)

我可以使用split命令。

  

n = awk 'END{print int(NR/2)}' file_name&amp;&amp; split -l $ n file_name

cat output1
111
222
333
444


cat output2 
555
666
777
888