![CSV를 분할하고 중간 파일 없이 헤더를 유지합니다.](https://linux55.com/image/58788/CSV%EB%A5%BC%20%EB%B6%84%ED%95%A0%ED%95%98%EA%B3%A0%20%EC%A4%91%EA%B0%84%20%ED%8C%8C%EC%9D%BC%20%EC%97%86%EC%9D%B4%20%ED%97%A4%EB%8D%94%EB%A5%BC%20%EC%9C%A0%EC%A7%80%ED%95%A9%EB%8B%88%EB%8B%A4..png)
컬 게시물을 위해 100MB 이상의 csv 파일 12개를 관리 가능한 작은 파일로 분할하려고 합니다.
이 작업을 성공적으로 수행했지만 임시 파일과 IO가 너무 많습니다. 이것은 영원이 걸립니다.
누군가 나에게 디스크 IO가 거의 또는 전혀 없이 이 작업을 더 효율적으로 수행할 수 있는 방법을 알려줄 수 있기를 바랍니다.
#!/bin/sh
for csv in $(ls *.csv); do
tail -n +2 $csv | split -a 5 -l - $RANDOM.split.
done
# chose a file randomly to fetch the header from
header=$(ls *.csv |sort -R |tail -1 | cut -d',' -f1)
mkdir split
for x in $(/usr/bin/find . -maxdepth 1 -type f -name '*.split.*'); do
echo Processing $x
cat header $x >> split/$x
rm -f $x
done
위 스크립트는 완전히 유효하지 않을 수 있습니다. 기본적으로 이러한 명령을 조합하여 달성했습니다.
업로드가 실패하면 컬 POST가 한 단계 더 수행되도록 하기로 결정했습니다. 모든 것이 게시되어도 데이터가 손실되는 것을 원하지 않았습니다. 그러나 컬 오류가 발생하면 데이터를 redo 폴더에 넣으면 작동합니다.
#!/bin/sh
# working on a progress indicator as a percentage. Never finished.
count=$(ls -1 | wc -l 2> /dev/null | cut -d' ' -f1)
for file in $(/usr/bin/find . -maxdepth 1 -type f); do
echo Processing $file
curl -XPOST --data-binary @$file -H "Content-Type: text/cms+csv" $1
done
답변1
완전히 다른 접근 방식은 다음과 같습니다.GNU 병렬, 해당 --header
및 --pipe
옵션을 사용합니다.
cat input.csv | parallel --header : --pipe -N 10 'cat > output{#}.csv'
-n 10
이렇게 하면 각 파일에 11줄이 남게 됩니다( 이런 방식으로 작성된 마지막 파일을 제외하고 헤더 줄에 10줄 추가 ).