Concatenar columnas horizontalmente. Imprimir solo las filas que se cruzan en la primera columna

Supongamos que tengo dos commands diferentes que generan contenido por columnas, por ejemplo:

$ command_1 7049857 abc fdg hsi 5409858 xxx fyy hsi 540958 abc zzz hsi 54230956 rbc sss hsi $ command_2 7049857 0 fdg free 5409858 0 fyy free 540958 2 zzz free 

Me gustaría tomar silenciosamente columnas con los índices x,y,z de la salida de command_1 y las columnas con los índices a,b,c del command_2 e imprimir una nueva salida: x,y,z,a,b,c .

Ejemplo:

Imprima la columna columna 1 y 2 desde commmand_2 : y la última columna desde command_1 :

 $ new_command 7049857 0 hsi 5409858 0 hsi 540958 2 hsi 

Lo que tengo hasta ahora

Soy relativamente nuevo en awk , pero sé que puedo tomar las columnas correspondientes de cada uno de estos commands con awk :

 command_1 | awk '{print $x " " $y " " $z}' command_2 | awk '{print $a " " $b " " $c}' 

Lo anterior concatena las columnas verticalmente pero necesito concatenarlas horizontalmente.

Imprimiendo solo aquellas filas que se cruzan en la primera columna:

Digamos que es posible que command_2 tenga más o less filas que command_1 . Sin embargo, la primera columna de ambos commands contiene elementos que pertenecen a la misma categoría (una identificación de varios dígitos, como en el ejemplo anterior)

Con esto, asumiendo que la primera columna de ambos commands está orderada por igual y que las inputs nuevas o faltantes solo pueden suceder al final, ¿cómo podemos asegurarnos de que solo imprimimos esas filas para las cuales tenemos inputs en command_1 y command_2 (es decir, intersección de ambos commands)? (el ejemplo anterior muestra esto)

Solutions Collecting From Web of "Concatenar columnas horizontalmente. Imprimir solo las filas que se cruzan en la primera columna"

Pruebe algo como esto:

 join <(command1) <(command2) | cut -d ' ' -f 1,5,4 

El command join toma files, no commands, pero con un shell como bash puede usar el constructo mostrado para convertir el resultado del command en un file virtual.

En lugar de cut , también puedes usar awk , si eso es lo tuyo.

Si te encuentras haciendo esto mucho, considera usar un motor de database relacional.

Si quieres awk, aquí hay una toma:

 awk ' NR==FNR {cmd1[$1] = $NF; next} $1 in cmd1 {print $1, $2, cmd1[$1]} ' <(command_1) <(command_2) 

La variable FNR awk es el número de línea dentro del file actual.
La variable NR es el número de línea de todas las líneas vistas hasta ahora.
Por lo tanto, la condición NR==FNR solo será verdadera para el primer argumento de file.