我使用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
并输出2.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
您想要的只是split命令,带有-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
这对我很有效。我在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,
I您可以使用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