Necesito combinar varios archivos .CSV (usando el comando cat
) pero sin copiar el encabezado de cada archivo.
¿Cuál es la mejor manera de realizar esta tarea?
Necesito combinar varios archivos .CSV (usando el comando cat
) pero sin copiar el encabezado de cada archivo.
¿Cuál es la mejor manera de realizar esta tarea?
Necesitará más que el comando cat
, como se describe here :
Supongamos que tiene 3 archivos CSV: file1.csv
, file2.csv
y file3.csv
y desea unirlos a bigfile.csv
y su encabezado es siempre (solo) la primera línea, luego use
o bien (mantener el encabezado desde el primer archivo):
cat < file1.csv <(tail +2 file2.csv) <(tail +2 file3.csv) > bigfile.csv
o (eliminar el encabezado de todos los archivos cuyos nombres comienzan con "archivo"):
awk 'FNR > 1' file*.csv > bigfile.csv
También puede usar un comando de grupo ( { ; }
) en lugar de la sustitución del proceso ( <()
):
{ head -n1 file1.csv; for f in file*.csv; do tail -n+2 "$f"; done; } > new.csv
También funciona con los finales de línea CRLF siempre que los archivos terminen con una línea vacía ( \r\n
).
POSIX 1003.1-2001 dejó obsoletas las versiones de solo cabeza y cola, y producen advertencias en algunos entornos.
Se necesita para concatenar dos CSV grandes con columnas idénticas en un CSV más grande para la secuencia de comandos de fragmentación (los datos no tienen ID únicos).
Primero tomó el encabezado de la segunda CSV
awk 'FNR > 1' file2.csv > file2_noheading.csv
A continuación, concatenado a través de lo siguiente
cat file1.csv file2_noheading.csv > newfile.csv
El uso de la secuencia de comandos anterior dio como resultado un archivo con el siguiente aspecto:
header,of,csv1
contents,of,csv1
==> csv2.csv
contents,of,csv2
Para convertirlo en un CSV adecuado, con una línea de cabecera y todos los valores relevantes, empleé el siguiente sed
incantation ... sed -ie "/^$/d;/^==>/d" bigfile.csv
Solución más fácil si tienes un montón de archivos:
awk 'FNR > 1' *.csv > merged.csv
Vuelva a editar el archivo grande y agregue el encabezado nuevamente.