¿Cómo dividir archivos CSV según el número de filas especificadas?

2

Tengo un archivo CSV (alrededor de 10,000 filas; cada fila tiene 300 columnas) almacenada en el servidor LINUX. Quiero dividir este archivo CSV en 500 archivos CSV de 20 registros cada uno. (Cada uno tiene el mismo encabezado CSV que el presente en el CSV original)

¿Hay algún comando de linux para ayudar a esta conversión?

Pawan Mude
fuente

Respuestas:

2

En aras de la integridad, aquí hay algunas mejoras menores:

  • Podrías guardar el encabezado. una vez y reutilizarlo muchas veces
  • Puede insertar el encabezado en los archivos divididos usando sed sin archivos temporales

Me gusta esto:

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

los $'\\\n' hay un personaje de NEWLINE que se escapó con una barra invertida. los sed expresión significa: insertar $header antes de la 1ª línea.

janos
fuente
1

Esto deberia hacerlo sin el encabezado CSV:

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

A continuación, puede agregar el encabezado a cada uno de los archivos:

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

Tratar:

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

O pruebe con awk:

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

versión multilínea:

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

La mejor manera de resolver esto usando POST mencionado a continuación:

Solución

    tail -n +2 file.txt | split -l 4 - split_
for file in split_*
do
    head -n 1 file.txt > tmp_file
    cat $file >> tmp_file
    mv -f tmp_file $file
done
Pawan Mude
fuente
0

Use GNU Parallel:

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

Si necesita ejecutar un comando en cada una de las partes, GNU Parallel también puede ayudarlo a hacerlo:

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 {}
Ole Tange
fuente