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 {}