如何逐行拆分 CSV 文件,并在两个输出文件中保留标题?

如何逐行拆分 CSV 文件,并在两个输出文件中保留标题?

我正在尝试通过以下命令拆分 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

你可以使用伟大的磨坊主

如果您想将此输入文件拆分为 2 个文件

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,

你可以使用分裂动词

mlr --csv split -m 2 input.csv

你将会拥有

Column_1,Column_2,Column_3
A,B,C
G,H,I
M,N,O
S,T,U
Y,Z,
Column_1,Column_2,Column_3
D,E,F
J,K,L
P,Q,R
V,W,X

答案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,""

相关内容