我正在尝试通过以下命令拆分 csv 文件-sample.csv。
split -n 2 -a 1 -d sample.csv test_
我得到两个大小相等的文件,一个带有标题,另一个没有标题,并且末尾的行被修剪掉。
当我看到下面的脚本时,结果显示在终端上,但没有生成文件。
split -n 1/2 -a 1 -d sample.csv test_
答案1
看起来这两个命令都按照设计的方式工作。
第一个按字节分割,这不会考虑行——当你分割一个大的二进制对象时很有用,但当它是像 CSV 这样的东西时就没那么有用了。
第二个看起来像是对文档的误读(但在技术上仍然有效)。
我认为你的意思是这样做:
split -n l/2 -a 1 -d sample.csv test_
请注意,这lower case L slash two
并不one slash two
像您看起来所做的那样。
您不会在第二部分看到标题行,因为split
它并不真正了解内容。
一种方法是做这样的事情
# extract header row and save
head -n1 sample.csv > header
# skip header row and split records to temporary files
tail -n+2 sample.csv | split -n l/2 -a 1 -d temp_
# make final files from header and split records
for f in temp_? ; do
cat header "$f" > "${f/temp/test}"
# clean up temporary file
rm "$f"
done
# clean up header file
rm header
答案2
答案3
您要么需要使用多个命令,要么需要一些更重的命令,例如awk
:
$ cat in.csv
Column_1,Column_2,Column_3
A,B,C
D,E,F
G,H,I
J,K,L
M,N,O
P,Q,R
S,T,U
V,W,X
Y,Z,""
$ awk '
BEGIN { x='"$(awk 'END { print NR }' in.csv)"' / 2 }
NR==1 { print > "out1.csv"; print > "out2.csv"; next }
NR<=x { print > "out1.csv"; next }
{ print > "out2.csv" }
' in.csv
$ cat out1.csv
Column_1,Column_2,Column_3
A,B,C
D,E,F
G,H,I
J,K,L
$ cat out2.csv
Column_1,Column_2,Column_3
M,N,O
P,Q,R
S,T,U
V,W,X
Y,Z,""