지정된 행 수에 따라 CSV 파일을 분할하는 방법은 무엇입니까?

지정된 행 수에 따라 CSV 파일을 분할하는 방법은 무엇입니까?

LINUX 서버에 CSV 파일(약 10,000개 행, 각 행에 300개 열 포함)이 저장되어 있습니다. 이 CSV 파일을 각각 20개의 레코드로 구성된 500개의 CSV 파일로 나누고 싶습니다. (각각 원본 CSV에 있는 것과 동일한 CSV 헤더를 가짐)

이 변환에 도움이 되는 Linux 명령이 있습니까?

답변1

완전성을 위해 다음은 몇 가지 사소한 개선 사항입니다.

  • 헤더를 저장할 수 있습니다한 번그리고 여러번 재사용
  • sed임시 파일 없이를 사용하여 분할 파일에 헤더를 삽입할 수 있습니다.

이와 같이:

header=$(head -n 1 file.csv)
tail -n +2 file.csv | split -l 20
for file in x??; do
    sed -i -e 1i$'\\\n'"$header" "$file"
done

백슬래시로 이스케이프된 NEWLINE 문자 가 $'\\\n'있습니다. 표현식은 첫 번째 줄 앞에 sed삽입한다는 의미입니다 .$header

답변2

이렇게 해야지없이CSV 헤더:

tail -n +2 file.csv | split -l 20

그런 다음 각 파일에 헤더를 추가할 수 있습니다.

for file in x*
do
    (head -n 1 file.csv; cat "$file") > "$file".new
    mv "$file".new "$file" # Stolen from @PawanMude's answer
done

답변3

노력하다:

fn="infile" c=0
{ 
  read header
  split -a 3 -l 3 - "$fn"
  for f in "$fn"???; do
    c=$((c+1))
    printf "%s\n" "$header" | cat - "$f" > "${f%???}-$c" && rm "$f"
  done 
} < $fn

아니면 awk로 시도해 보세요:

awk 'NR==1{h=$0; next} !((NR-2)%n){close(f); f=FILENAME "-" ++c; print h>f}{print>f}' n=3 infile

여러 줄 버전:

awk '
  NR==1 {
    h=$0
    next
  }
  !((NR-2)%n) {
    close(f)
    f=FILENAME "-" ++c
    print h>f
  }
  {
    print>f
  }
' n=3 infile

답변4

GNU 병렬 사용:

cat bigfile.csv | parallel -N20 --header : --pipe 'cat > {#}'

각 부분에 대해 명령을 실행해야 하는 경우에도 GNU Parallel이 도움이 될 수 있습니다.

cat bigfile.csv | parallel -N20 --header : --pipe my_program_reading_from_stdin

cat bigfile.csv | parallel -N20 --header : --pipe --cat my_program_reading_from_a_file {}

관련 정보