0

我正在使用 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 个文件,其中文件名被编号

有什么建议么?

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

解释:

模运算符是这里的关键,我们希望在每四行之后拆分输入行:

$ 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==0as zero 的简写,评估为 false 并且NR%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

这对我有用。我在 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,
于 2013-04-10T01:43:12.987 回答
0

我可以使用split命令。

n= awk 'END{print int(NR/2)}' file_name&& 拆分 -l $n 文件名

cat output1
111
222
333
444


cat output2 
555
666
777
888
于 2013-04-10T07:51:49.127 回答