File1.txt
item1 carA
item2 carB
item3 carC
item4 platD
item5 carE
File2.txt
carA platA
carB platB
carC platC
carE platE
Salida deseada:
item1 platA
item2 platB
item3 platC
item4 platD
item5 platE
¿Cómo puedo hacerlo?
command-line
text-processing
awk
pawana
fuente
fuente
Sé que dijiste
awk
, pero hay unjoin
comando para este propósito ...Sería suficiente con el primer
join
comando si no fuera por esta línea:El comando básicamente dice: unirse basado en la segunda columna del primer archivo (
-1 2
), y la primera columna del segundo archivo (-2 1
), y generar la primera columna del primer archivo y la segunda columna del segundo archivo (-o 1.1,2.2
). Eso solo muestra las líneas que se emparejaron. El segundo comando de unión dice casi lo mismo, pero dice mostrar las líneas del primer archivo que no se pudieron emparejar (-v 1
), y mostrar la primera columna del primer archivo y la segunda columna del primer archivo (-o 1.1,1.2
). Luego clasificamos la salida de ambos combinados.sort -k 1
significa ordenar en base a la primera columna, ysort -k 2
significa ordenar en base a la segunda. Es importante ordenar los archivos según la columna de unión antes de pasarlosjoin
.Ahora, escribí la clasificación dos veces, porque no me gusta llenar mis directorios con archivos si puedo evitarlo. Sin embargo, como dijo David Foerster, dependiendo del tamaño de los archivos, es posible que desee ordenar los archivos y guardarlos primero para no tener que esperar para ordenarlos dos veces. Para dar una idea de los tamaños, aquí está el tiempo que toma ordenar 1 millón y 10 millones de líneas en mi computadora:
Eso es 1.5 segundos para 1 millón de líneas y 19 segundos para 10 millones de líneas.
fuente
%E
en el formato de tiempo) es menos interesante para medir el rendimiento computacional. El tiempo de CPU del modo de usuario (%U
o simplemente unaTIMEFORMAT
variable no establecida) sería mucho más significativo.%U
.