Tengo dos archivos con varias filas. El primer archivo tiene 2 columnas y el segundo archivo tiene más de 2000 columnas. Los conjuntos de datos de ejemplo son:

Archivo de ejemplo_1

car Maruti
car TATA
car Hyundai
car Jaguar
Jeep Mahindra

Archivo de ejemplo_2

car  A B C D E F G
Jeep X Y Z W Q W K

He probado esto

awk '{a[$1]=a[$1]" "$0} ++n[$1]==2{print a[$1]}' File_2 File_1

La salida de este comando imprime los datos solo una vez y no en perfecto orden. Obtuve el siguiente resultado:

car  A B C D E F G car Maruti
Jeep X Y Z W Q W K Jeep Mahindra

La salida esperada sobre la base del primer archivo es:

car  Maruti    car  A B C D E F G
car  TATA      car  A B C D E F G
car  Hyundai   car  A B C D E F G
car  Jauar     car  A B C D E F G
Jeep Mahindra  Jeep X Y Z W Q W K
1
Ravi Saroch 19 dic. 2019 a las 13:40

2 respuestas

La mejor respuesta

Por favor, intente seguir.

awk 'FNR==NR{a[$1]=$0;next} ($1 in a){print $0,a[$1]}'  file2 file1 | column -t

La salida será la siguiente.

car   Maruti    car   A  B  C  D  E  F  G
car   TATA      car   A  B  C  D  E  F  G
car   Hyundai   car   A  B  C  D  E  F  G
car   Jaguar    car   A  B  C  D  E  F  G
Jeep  Mahindra  Jeep  X  Y  Z  W  Q  W  K
2
RavinderSingh13 19 dic. 2019 a las 10:48

Sería más fácil usar el comando join aquí, que está hecho específicamente para tareas como la suya. Sin embargo, join requiere archivos ordenados, así que primero los ordenamos.

Con bash la clasificación se puede hacer en el lugar

join <(sort 1stFile) <(sort 2ndFile)

Con un shell posix simple (sh) debe usar archivos temporales

 sort 1stFile > 1stFileSorted
 sort 2ndFile > 2ndFileSorted
 join 1stFileSorted 2ndFileSorted
 rm 1stFileSorted 2ndFileSorted

Para alinear las columnas en la salida, puede usar join … | column -t.

1
Socowi 19 dic. 2019 a las 10:54