dividir un CSV y mantener el encabezado sin files intermedios

Estoy tratando de dividir una docena de files de 100MB + csv en files pequeños manejables para una publicación curl.

He logrado hacerlo pero con muchos files temporales y IO. Se está tomando una eternidad.

Espero que alguien pueda mostrarme una manera de hacer esto de manera mucho más efectiva; preferiblemente con poco o ningún disco 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 

El script anterior puede no funcionar del todo. Básicamente lo obtuve trabajando a través de una combinación de estos commands.

Decidí hacer que el curl POST sea otro paso completamente en el caso de falla de carga; No quería perder los datos si todo estaba publicado. Pero, si, por ejemplo, en caso de error de curl, los datos se pueden poner en una carpeta de rehacer, entonces eso puede funcionar.

 #!/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 

Un enfoque completamente diferente sería usar GNU paralelo , y usar sus opciones --header y --pipe :

 cat input.csv | parallel --header : --pipe -N 10 'cat > output{#}.csv' 

Esto le dará 11 líneas en cada uno de los files (la línea del encabezado más los diez de -n 10 , excepto en el último file escrito de esa manera).