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
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 paste
comando para combinar os arquivos e, em seguida, processamento sua saída por awk
comando.
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
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