首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在bash中将csv的单列水平拆分为多个BASH中的较小csv文件

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

Stack Overflow用户
提问于 2013-04-10 01:14:00
回答 4查看 1.6K关注 0票数 0

我使用bash,并且在csv中有一个列(非行),没有头- samplefile.csv。

代码语言:javascript
代码运行次数:0
运行
复制
111 
222 
333 
444 
555 
666 
777 
888

我希望将其拆分为(例如)2个4行的csv文件和一个单独的列(如果奇数表示9行,那么5和4) csv文件包含数据。

输出1.csv (1列4行)

代码语言:javascript
代码运行次数:0
运行
复制
111
222
333
444

和输出2.csv (1列4行)

代码语言:javascript
代码运行次数:0
运行
复制
555
666
777
888

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

有什么建议吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-04-10 09:23:33

这对于awk、try、awk '{print $0 > ("output"i+1".csv")}!(NR%4){i++}' file来说很简单。

演示:

代码语言:javascript
代码运行次数:0
运行
复制
$ 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

解释:

模数运算符是这里的关键,我们希望将输入行除以第四行之后:

代码语言:javascript
代码运行次数:0
运行
复制
$ awk '{print NR%4,$0}' file
1 111
2 222
3 333
0 444
1 555
2 666
3 777
0 888

4/4的模数(余数)当然是零,所以我们用这个事实来增加文件计数器。!(NR%4)NR%4==0的缩写,计算值为零,NR%4是零,当我们希望块{i++}执行时,NR%4是零,所以我们否定它。

代码语言:javascript
代码运行次数:0
运行
复制
$ 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
票数 3
EN

Stack Overflow用户

发布于 2013-04-10 09:01:08

您要寻找的是使用-n选项的拆分命令

代码语言:javascript
代码运行次数:0
运行
复制
split -nl/2 input output

会帮你做好这份工作。

从split手册页:

代码语言:javascript
代码运行次数:0
运行
复制
-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
票数 1
EN

Stack Overflow用户

发布于 2013-04-10 01:43:12

这对我有用。我在excel中打开了生成的csv,它被正确地格式化。我还没有弄清楚如何删除后面的逗号,但根据许多csv格式的定义,这似乎是可以接受的。第一个xargs调用向文件的每一行添加一个逗号。第二批xargs将四组聚在一起。如果您将其重定向到一个文件(> new.csv),它可能就是您要寻找的文件。

代码语言:javascript
代码运行次数:0
运行
复制
>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,
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15915308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档