LINUX 서버에 CSV 파일 (약 10,000 행, 각 행마다 300 열)이 저장되어 있습니다. 이 CSV 파일을 각각 20 개 레코드의 500 개 CSV 파일로 나누고 싶습니다. (각각 원본 CSV에있는 것과 동일한 CSV 헤더를 가짐)
이 변환을 돕는 Linux 명령이 있습니까?
LINUX 서버에 CSV 파일 (약 10,000 행, 각 행마다 300 열)이 저장되어 있습니다. 이 CSV 파일을 각각 20 개 레코드의 500 개 CSV 파일로 나누고 싶습니다. (각각 원본 CSV에있는 것과 동일한 CSV 헤더를 가짐)
이 변환을 돕는 Linux 명령이 있습니까?
답변:
그것을 함수로 만들었습니다. 이제 전화 할 수 있습니다.splitCsv <Filename> [chunkSize]
splitCsv() {
HEADER=$(head -1 $1)
if [ -n "$2" ]; then
CHUNK=$2
else
CHUNK=1000
fi
tail -n +2 $1 | split -l $CHUNK - $1_split_
for i in $1_split_*; do
sed -i -e "1i$HEADER" "$i"
done
}
위치 : http://edmondscommerce.github.io/linux/linux-split-file-eg-csv-and-keep-header-row.html
split
은 접두사 split_
2를 사용하여 20 줄씩 새 파일로 분할됩니다 . 새 split_ * 파일을 반복하여 각 이름을 file
한 번에 하나씩 변수에 저장합니다. 3 : for each ... 4 : 원본 파일의 첫 번째 줄 (열 헤더)을 tmp_file
5 :에 작성합니다. 5 : 20 줄 분할 파일을 추가합니다 tmp_file
. 6 : 이전 split_ * 파일을 new로 덮어 써 tmp_file
열 헤더를 유지합니다.
echo -e "$HEADER\n$(cat $i)" > $i
것은 불필요하게 중요합니다 . 나는 그것을 sed -i -e "1i$HEADER" "$i"
.
Linux split 명령을 사용하십시오.
split -l 20 file.txt new
"file.txt"파일을 각각 20 줄의 텍스트가 포함 된 "new"이름으로 시작하는 파일로 분할합니다.
man split
자세한 내용은 Unix 프롬프트에서 입력 하십시오. 그러나 먼저 file.txt에서 헤더를 제거한 다음 ( tail
예 : 명령 사용 ) 각 분할 파일에 다시 추가해야합니다.
wc -l
하여 줄 수를 얻은 다음이 값에서 1을 뺀 wc -l
다음 tail -n 49
(이 예에서 50 을 주었다고 가정 ) 실행 하여 헤더 줄을 제외한 모든 것을 가져옵니다. wc -l
<newline> 문자 를 계산하므로 마지막 줄이 줄 바꿈 문자로 끝나지 않으면 줄 수에서 1만큼 떨어져 있습니다.
tail -n +2
는 첫 번째 줄을 제외하고 모든 줄을 인쇄합니다.
--additional-suffix=.csv
이것은 작동합니다 !!!
file_name
= 분할하려는 파일의 이름.
10000
= 각 분할 파일에 포함될 행 수
file_part_
= 분할 파일 이름의 접두사 (file_part_0, file_part_1, file_part_2..etc 계속됨)
split -d -l 10000 file_name.csv file_part_
head -200000 file.csv | split -l 10000 - new_
그러면 모든 파일이 Part1-Part500으로 표시됩니다.
#!/bin/bash
FILENAME=10000.csv
HDR=$(head -1 $FILENAME) # Pick up CSV header line to apply to each file
split -l 20 $FILENAME xyz # Split the file into chunks of 20 lines each
n=1
for f in xyz* # Go through all newly created chunks
do
echo $HDR > Part${n} # Write out header to new file called "Part(n)"
cat $f >> Part${n} # Add in the 20 lines from the "split" command
rm $f # Remove temporary file
((n++)) # Increment name of output part
done
한 줄짜리 답변이 있습니다 (이 예는 파일 당 999 줄의 데이터와 하나의 헤더 행을 제공합니다)
cat bigFile.csv | parallel --header : --pipe -N999 'cat >file_{#}.csv'