Tengo un archivo de resultados A.tsv
(separador = \t
):
BC01 2551 99
BC03 2547 95
BC04 2578 99
BC05 2547 97
Y un archivo con información de muestra B.tsv
(separador = \t
):
BC01
BC04
BC02
BC03
BC05
Y quiero agregar A.tsv
(pero imprimir en un archivo nuevo) la muestra que falta en B.tsv
:
BC01 2551 99
BC02
BC03 2547 95
BC04 2578 99
BC05 2547 97
Hasta ahora probé algún comando awk pero nada concluyente:
awk -v OFS="\t" 'NR==FNR{a[$1]=$1;next}{print $0};NR!=FNR{a[$1]=$1;next}{print $1}' B.tsv A.tsv > C.tsv
Sabes como hacer esto ?
Respuesta1
Un enfoque correcto para procesar estos archivos sería decodificarlos A.tsv
en un diccionario con la clave $1
, almacenar el contenido de toda la línea y luego usarlo más adelante B.tsv
para buscar los valores, es decir
awk -v FS="\t" ' FNR == NR { arr[$1] = $0; next }
( $1 in arr ){ print arr[$1]; next } { print $1 }' A.tsv B.tsv
Si desea que el resultado final esté ordenado por $1
, es posible que deba indexar el contenido de ambos archivos y procesarlo finalmente imprimiendo END
la clave sola si el valor no está presente.
awk -v FS="\t" ' FNR == NR { arr[$1] = $0; next }
!( $1 in arr ) { arr[$1] } END { for (x in arr) print arr[x] ? arr[x] : x }' A.tsv B.tsv