bash - primera - usando awk cómo fusionar 2 archivos, digamos A & B y hacer una función de combinación externa izquierda e incluir todas las columnas en ambos archivos
mostrar columnas awk (3)
join
al rescate:
$ join -t $'','' -a 1 -e '''' -o 0,1.2,1.3,1.4,2.2,2.3 file1.txt file2.txt
Explicación:
-t $'',''
: token separador de campo.
-a 1
: no descartar registros del archivo 1 si no están presentes en el archivo 2.
-e ''''
: los registros faltantes se tratarán como un campo vacío.
-o
: formato de salida.
archivo1.txt
1,a,b,c
2,a,b,c
3,a,b,c
5,a,b,c
archivo2.txt
1,x,y
2,x,y
5,x,y
6,x,y
7,x,y
Salida
1,a,b,c,x,y
2,a,b,c,x,y
3,a,b,c,,
5,a,b,c,x,y
Tengo varios archivos con diferente número de columnas, necesito hacer una combinación en el primer archivo y el segundo y hacer una combinación externa izquierda en awk respectiva al primer archivo e imprimir todas las columnas en ambos archivos que coincidan con la primera columna de ambos archivos.
He intentado códigos a continuación para acercarme a mi salida. Pero no puedo imprimir el ",", donde no se encuentra ningún número coincidente en el segundo archivo. A continuación se muestra el código. Unir las necesidades de clasificación y toma más tiempo que awk. Mis tamaños de archivo son grandes, como 30 millones de registros.
awk -F '','' ''{
if (NR==FNR){ r[$1]=$0}
else{ if($1 in r)
r[$1]=r[$1]gensub($1,"",1)}
}END{for(i in r){print r[i]}}'' file1 file2
archivo1
number,column1,column2,..columnN
File2
numbr,column1,column2,..columnN
Salida
number,file1.column1,file1.column2,..file1.columnN,file2.column1,file2.column3...,file2.columnN
archivo1
1,a,b,c
2,a,b,c
3,a,b,c
5,a,b,c
archivo2
1,x,y
2,x,y
5,x,y
6,x,y
7,x,y
salida deseada
1,a,b,c,x,y
2,a,b,c,x,y
3,a,b,c,,,
5,a,b,c,x,y
puedes probar,
awk ''BEGIN{FS=OFS=","}
FNR==NR{d[$1]=substr($0,index($0,",")+1); next}
{print $0, ($1 in d?d[$1]:",")}'' file2 file1
usted obtiene,
1,a,b,c,x,y
2,a,b,c,x,y
3,a,b,c,,
5,a,b,c,x,y
$ cat tst.awk
BEGIN { FS=OFS="," }
NR==FNR {
tail = gensub(/[^,]*,/,"",1)
if ( FNR == 1 ) {
empty = gensub(/[^,]/,"","g",tail)
}
file2[$1] = tail
next
}
{ print $0, ($1 in file2 ? file2[$1] : empty) }
$ awk -f tst.awk file2 file1
1,a,b,c,x,y
2,a,b,c,x,y
3,a,b,c,,
5,a,b,c,x,y
Lo anterior usa GNU awk para gensub (), con otras awks es solo un paso más para hacer [g] sub () en la variable apropiada después de asignarlo inicialmente.
Una alternativa interesante (¡al menos para mí!) Que quizás desee probar para una diferencia de rendimiento es:
$ cat tst.awk
BEGIN { FS=OFS="," }
NR==FNR {
tail = gensub(/[^,]*,/,"",1)
idx[$1] = NR
file2[NR] = tail
if ( FNR == 1 ) {
file2[""] = gensub(/[^,]/,"","g",tail)
}
next
}
{ print $0, file2[idx[$1]] }
$ awk -f tst.awk file2 file1
1,a,b,c,x,y
2,a,b,c,x,y
3,a,b,c,,
5,a,b,c,x,y
pero realmente no espero que sea más rápido y PUEDE incluso ser más lento.