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

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

Tengo un archivo CSV (alrededor de 10,000 filas; cada fila tiene 300 columnas) almacenado 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 CSV original)

¿Existe algún comando de Linux para ayudar en esta conversión?

Respuesta1

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

  • Podrías guardar el encabezado.una vezy reutilizar muchas veces
  • Puede insertar el encabezado en los archivos divididos sedsin archivos temporales

Como 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

Hay $'\\\n'un carácter NEWLINE con una barra invertida. La sedexpresión significa: insertar $headerantes de la 1ª línea.

Respuesta2

esto debería hacerlosinel encabezado CSV:

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

Luego 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

Respuesta3

Intentar:

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 prueba 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

Respuesta4

Utilice GNU paralelo:

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

Si necesita ejecutar un comando en cada una de las partes, GNU Parallel también puede ayudarle 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 {}

información relacionada