extender el script awk para múltiples líneas en ambos archivos de texto y no si ambos archivos tienen un solo registro

Dec 01 2020

PUEDO generar esta salida de 3 .txt

AA;BB;CC;DD;

de 2 archivos de texto. Ambos archivos solo tienen un registro

1 .txt

AA;BB;

2 .txt

CC;DD;BB;AA;

Yo uso este script awk.

BEGIN{
  FS=OFS=";"
}
{
  for(i=1;i<=NF;i++){
    if(!seen[$i]++){ val=(val?val OFS:"")$i }
  }
  print val
  delete seen
  val=""
}

Yo uso de esta manera, uso el pastecomando para combinar ambos archivos y luego procesar su salida por awkcomando.

paste 1st.txt 2nd.txt | awk -f tst.awk > "3.txt"

Pero que quiero
Necesito considerar más de un solo registro. Intento adaptar este guión para esta situación. Puede ver que ahora ambos archivos no tienen un solo registro.

1 .txt

UU;    
AA;BB;
ZZ;KK;

2 .txt

CC;DD;BB;AA;
LL;KK;
GH;ZZ;SS;

la salida 3 .txt que trato de generar es esta

UU;
AA;BB;CC;DD;
ZZ;KK;LL;GH;SS;

lógica de procesamiento:

El código anterior solo usa cadenas literales en una búsqueda hash de índices de matriz, por lo que no le importa qué caracteres tiene en su entrada.
Sin embargo sobre la salida de muestra: si en 2 .txt hay campos comunes también en 1 .txt. Por ejemplo, BB;AA;entonces necesita concatenarlos en una sola fila, es decir AA;BB;CC;DD; No se requiere ordenar, por ejemplo, no es relevante si la salida es La BB;AA;DD;CC;única condición que se requiere es evitar campos duplicados en la misma fila

Cuando digo 'evitar duplicados' me refiero a evitar esta salida

AA;BB;CC;DD;BB;AA;

porque la salida debe ser

AA;BB;CC;DD;

Respuestas

4 User Dec 01 2020 at 15:23

Quizás esto es lo que quieres:

BEGIN{FS=OFS=";"}
{sub(/;$/,"")} NR==FNR{ for (i=1;i<=NF;++i) for (j=1;j<=NF;++j) if (j!=i&&!b[$i,$j]++) a[$i,++c[$i]]=$j
    next
}
{
    delete b
    for (i=1;i<=NF;++i)
        ++b[$i] for (i=1;i<=NF;++i) for (j=1;j<=c[$i];++j)
            if (!b[a[$i,j]]++) $(NF+1)=a[$i,j]
    print
}

Úselo así:

awk -f script.awk 2.txt 1.txt

Aquí hay algunas preguntas anteriores (presumiblemente suyas; es posible que desee revisarlas y trabajar en cómo hacer su pregunta correctamente):

  • https://superuser.com/q/1600078
  • awk: conserva el orden de las filas y elimina las cadenas duplicadas (espejos) al generar datos
  • https://superuser.com/q/1600557
  • https://superuser.com/q/1601402
  • https://superuser.com/q/1602713
  • https://stackoverflow.com/q/64929865
  • https://superuser.com/q/1604046
  • Expresiones regulares dinámicas en awk
  • Truncamiento de cadenas después de ejecutar el script awk