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

관련 정보