estende o script awk para várias linhas em ambos os arquivos de texto e não se ambos os arquivos tiverem apenas um único registro

Dec 01 2020

POSSO gerar esta saída de 3 .txt

AA;BB;CC;DD;

de 2 arquivos de texto. Ambos os arquivos têm apenas um único registro

1 .txt

AA;BB;

2 .txt

CC;DD;BB;AA;

Eu 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=""
}

Eu uso desta forma, eu uso o pastecomando para combinar os arquivos e, em seguida, processamento sua saída por awkcomando.

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

Mas o que eu quero?
Preciso considerar mais de um único registro. Tento adaptar esse script para essa situação. Você pode ver que agora ambos os arquivos não possuem apenas um único registro.

1 .txt

UU;    
AA;BB;
ZZ;KK;

2 .txt

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

a saída 3 .txt que tento gerar é esta

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

lógica de processamento:

O código acima usa apenas strings literais em uma pesquisa hash de índices de array, portanto, não importa quais caracteres você tem em sua entrada.
No entanto, sobre a saída de amostra: se em 2 .txt houver campos comuns também em 1 .txt . Por exemplo BB;AA;, você precisará concatená-los em uma única linha, ou seja AA;BB;CC;DD; O pedido não é obrigatório, por exemplo, não é relevante se a saída for. A BB;AA;DD;CC;única condição necessária é evitar campos duplicados na mesma linha

Quando digo "evitar duplicatas", quero dizer evite esta saída

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

porque a saída deve ser

AA;BB;CC;DD;

Respostas

4 User Dec 01 2020 at 15:23

Talvez seja isso que você deseja:

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
}

Use-o assim:

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

Aqui estão algumas perguntas anteriores (presumivelmente suas - você pode querer examiná-las e trabalhar em como fazer sua pergunta corretamente):

  • https://superuser.com/q/1600078
  • awk: preservar a ordem das linhas e remover strings duplicadas (espelhos) ao gerar dados
  • 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
  • Expressões regulares dinâmicas no awk
  • Truncamento de strings após a execução de um script awk