file1.csv
A,,C,D
A,,C,D
A,,C,D
A,,C,D
file2.csv
A,B
A,B
A,B
A,B
Output.csv deseado
A,B,C,D
A,B,C,D
A,B,C,D
A,B,C,D
He intentado usar "unirse" y "pegar" en vano. ¿Hay un comando bash para hacer esto? La columna "A" es la misma en ambos .csv
archivos.
Respuestas:
Con solo
awk
comando:Obtenga una línea del archivo1 y almacénela en una variable local
f1
, luego imprima la línea que se almacenóf1
y finalmente imprima los campos tercer ($3
) y adelante ($3
) del archivo1 que se delimitaron con una coma por,
completo, y cambie el OFS (separador de campo de salida [espacio por predeterminado]) a coma (,
).El comando corto sería así:
pegue el archivo2, luego corte y pegue la tercera columna a la siguiente (
-f3-
) del archivo1.Con
awk
ypaste
(opción A)El siguiente comando también copia las dos últimas columnas (
C,D
) del archivo1 al final de cada línea en el archivo2:El comando anterior pega el contenido del archivo2, luego imprime un delimitador de coma (
-d','
) y luego pega los dos últimos campos (NF
es el índice del último campo y$NF
es la cadena que es su índiceNF
. Así$(NF-1)
es el segundo campo antes del último campo) del archivo1 cuando ese índice redefine o se divide con el espectador de coma (-F','
).Con
awk
ypaste
(opción B)Este comando también es el mismo que el anterior (
$3
y$4
apunta al tercer y cuarto campo de cada línea del archivo1):O otra solución con
cut
comando:el comando cortar en el comando anterior primero corta el primer campo (
-f1
que está indexado con el delimitador de coma (-d.
)) del archivo1 (cut -d, -f1 file1
), luego corta y pega el segundo campo del archivo2 (cut -d, -f2 file2
) y finalmente corta y pega la tercera columna (-f3
) a los siguientes (-
) del archivo1 (cut -d, -f3- file1
) nuevamente.Este comando también devuelve el mismo resultado:
pegue el segundo campo del archivo1 (
awk -F',' '{print $1}' file1
) luego imprima una coma (-d,
), luego pegue la segunda columna del archivo2 (awk -F',' '{print $2}' file2
), finalmente pegue la segunda y última columna del archivo1 (awk -F',' '{print $3","$4}' file1
) nuevamente.fuente
Aquí hay una belleza (creo):
Desglosado en pasos:
Paso 1. Instale csvkit:
Paso 2. Use el comando de unión con una coma como separador
Paso 3. Aliméntalo con las columnas reales que deseas. Observe cómo alimenta la primera columna dos veces, porque esa es en la que se realiza la unión (comportamiento predeterminado de
join
).o en taquigrafía:
Si lo desea, puede redirigir esa salida estándar a un archivo (salida deseada).
Ventajas
Este método tiene varias ventajas sobre los otros propuestos.
Primero y principal: realiza una unión real. Eso significa que también se puede usar para datos más complejos. Es muy fácil hacer una unión en otro campo, por ejemplo. No solo mira la posición del campo, sino que realmente toma en cuenta la columna. Realmente funciona con el formato de los datos (csv) y no lo trata como texto.
En segundo lugar, utiliza el potente kit de herramientas csv que también le permite a) mostrar estadísticas con un comando (
csvstats)
, b) verificar si los datos están limpios (csvclean
), pero también transformarlos en json, en sql, o incluso cargarlos en ¡pitón! Este kit de herramientas se usa mucho en ciencia de datos para la preparación de datos.fuente
sudo apt-get install python-dev python-pip python-setuptools build-essential
- enlaceAquí hay otro hermoso. Creo que es la más fácil de todas las sugerencias, hasta ahora.
Si no ha instalado csvtool ya en el pasado, debe hacerlo
sudo apt-get install csvtool
.De los documentos:
Tenga en cuenta cómo en nuestro caso estamos reemplazando las segundas columnas de los archivos.
Ejemplos
file1.csv
file2.csv
Combinando los dos archivos:
Lo que esencialmente hacer es pegar la columna dos de
file2.csv
que la columna 2 enfile1.csv
.Tenga en cuenta que esto también funciona en el mismo documento. Si desea intercambiar dos columnas, puede hacerlo utilizando el mismo archivo que input.csv y update.vsc.
fuente
Para mover un número elegido de columnas de un archivo a otro:
de dos archivos:
archivo_1
archivo_2
Cuando configuras
cols = 1
:Pero cuando configuras
cols = 2
:cols = 3
:Cómo utilizar
Copiarlo en un archivo vacío, establecer la ruta a
file1
,file2
y el número de columnas a mover, guardar comomove.py
y ejecutarlo por:También es posible agregar una o más columnas desde el medio de las columnas del archivo fuente de esta manera.
fuente
import csv
embargo, me hubiera encantado verte usar .Otro método en python a través del módulo csv.
script.py
Para ejecutar el script anterior,
Salida:
fuente