texto primera numero mostrar linea fmt con comandos comando columnas columna caracter buscar añadir bash awk

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.