Fusionar columnas de dos archivos separados

10

¿Cómo crear un nuevo archivo fusionando columnas selectivas de dos archivos separados usando awk? Sin estropear el orden de los elementos de AMBOS archivos.

Ejemplo: el archivo 3 puede contener la columna 1,2,3 del archivo 1 y la columna 4 del archivo 2.

File 1
A   23  8   T
A   63  9   9
B   45  3   J

File 2
A   0
A   6   
B   5

File 3
A   23  8   0
A   63  9   6
B   45  3   5
dovah
fuente

Respuestas:

4

Prueba esto:

$ awk 'FNR==NR{a[FNR]=$2;next};{$NF=a[FNR]};1' file2 file1
A 23 8 0
A 63 9 6
B 45 3 5
Cuonglm
fuente
¡Gracias! También probé con éxito usando gawk:pr -m -t -s\ File1.txt File2.txt | gawk '{print $1,$2,$3, $6}' > File3.txt
dovah
2
@Dovah: puede usar paste file1 file2y luego imprimir los campos seleccionados en awk.
Cuonglm
Esto se almacena file2en la memoria, lo que puede ser prohibitivo si los archivos son grandes. Hay una manera más simple de hacer esto sin la sobrecarga de memoria (vea mi respuesta).
Gilles 'SO- deja de ser malvado'
17

Hay una herramienta dedicada para que: paste. Concatena cada línea completa del primer archivo con la línea correspondiente del segundo archivo; Puede eliminar columnas no deseadas antes o después. Por ejemplo, suponiendo que sus columnas están delimitadas por tabuladores:

paste file1.txt file2.txt | cut -f 1,2,3,6

Aquí hay una manera de prefiltrar ambos archivos que se basan en la sustitución del proceso ksh / bash / zsh.

paste <(<file1.txt sed 's/[[:space:]][[:space:]]*[^[:space:]]*$//') \
      <(<file1.txt sed 's/^[^[:space:]]*[[:space:]][[:space:]]*//')

Awk está orientado principalmente a procesar un archivo a la vez, pero puede llamar getlinepara leer de otro archivo en paralelo.

awk '
  BEGIN {file2=ARGV[2]; ARGV[2]="";}
  {$0 = $0 ORS getline(); print $1, $2, $3, $6;}
' file1.txt file2.txt

Hasta ahora, he asumido que desea hacer coincidir la línea 1 del archivo 1 con la línea 1 del archivo 2, la línea 2 del archivo 1 con la línea 2 del archivo 2, etc. Si desea hacer coincidir el contenido de una columna, eso es un materia completamente diferente. joinhará el trabajo siempre que la columna que desee hacer coincidir esté ordenada.

Gilles 'SO- deja de ser malvado'
fuente