awk: imprime duplicatas de dois arquivos

0

Arquivo1:

23455|abc|xyz
23455|abc|xsd
34433|wer|sad
45655|fdf|fcd

Arquivo2:

v343v|23455
z565z|23455
c9898|34433
b2323|45655

O resultado deve ser:

23455|abc|xyz|v343v
23455|abc|xyz|z565z
23455|abc|xsd|v343v
23455|abc|xsd|z565z
34433|wer|sad|c9898
45655|fdf|fcd|b2323

Estou usando o comando abaixo:

awk -F'|' 'NR==FNR { a[$1]=$1"|"$2"|"$3; next} $2 > 0 {print a[$2] "|" $1}' file1 file2 > result.txt

Mas só mostrando o resultado:

23455|abc|xsd|v343v
23455|abc|xsd|z565z
34433|wer|sad|c9898
45655|fdf|fcd|b2323

Nota: Ambos os arquivos têm dados em ordem aleatória

    
por Maddys 13.06.2018 / 12:01

2 respostas

1
$ join -t '|' -2 2 file1 file2
23455|abc|xyz|v343v
23455|abc|xyz|z565z
23455|abc|xsd|v343v
23455|abc|xsd|z565z
34433|wer|sad|c9898
45655|fdf|fcd|b2323

Isso realiza uma operação de JOIN relacional nos dois arquivos. O -t '|' informa join que | é usado como um delimitador de campo nos dados de entrada e -2 2 diz para usar o segundo campo no segundo dos dois arquivos (em vez do primeiro).

Isso pressupõe que a coluna de junção esteja classificada nos dois arquivos.

Eles não estão classificados e pré-classificam os arquivos usando

sort -t '|' -k1 -o file1 file1
sort -t '|' -k2 -o file2 file2

ou classifique ao mesmo tempo que você chama join usando uma substituição de processo em um shell que suporte isso:

join -t '|' -2 2 \
    <( sort -t '|' -k1 file1 ) \
    <( sort -t '|' -k2 file2 )
    
por 13.06.2018 / 12:13
0

Usando awk :

awk 'BEGIN{FS=OFS="|"}NR==FNR{a[$0];next}{for(i in a)if(index(i,$2)==1) print i,$1}' file1 file2

O for faz um loop por todas as linhas do arquivo1 armazenadas na matriz a . Se o primeiro elemento do segundo arquivo corresponder e a entrada da matriz, imprima-o.

    
por 13.06.2018 / 13:10

Tags