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
sed
sin 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 sed
expresión significa: insertar $header
antes 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 {}