Imprime a coluna correspondente e sem correspondência com padrão

2

Eu tenho dois arquivos f1.txt e f2.txt. Eu preciso comparar os dois arquivos e imprimir os coloums correspondentes, bem como imprimir as colunas sem correspondência com o padrão "não encontrado".

f1:

hari:1.2.3.4/32
abc:3.4.5.6/24
bcd:8.9.10.11/34

f2:

1.2.3.4/32
3.4.5.6/24
8.9.10.11/34
10.12.34.0/22
1.4.5.7/34

Resultado desejado:

hari:1.2.3.4/32
abc:3.4.5.6/24
bcd:8.9.10.11/34
not found:10.12.34.0/22
not found:1.4.5.7/34

alguém poderia por favor ajudar a obter o resultado desejado.

Obrigado

    
por user2175455 06.09.2016 / 13:10

2 respostas

4

Você pode usar o awk:

$ awk -F':' -vOFS=':' 'NR==FNR{a[]=;next}{print  in a?a[]:"not found",}' file1 file2
hari:1.2.3.4/32
abc:3.4.5.6/24
bcd:8.9.10.11/34
not found:10.12.34.0/22
not found:1.4.5.7/34

Em um formato mais legível:

awk -F':' -vOFS=':' 'NR == FNR { # For the first file (file1)
                        a[] =  # store the first token in an array 
                                   # using the second token as the key
                        next       # skip to the next record
                     }
                     {  # For all lines of file 2
                        print  in a ? a[] : "not found" ,  # print the desired result
                     }' file1 file2
    
por user000001 06.09.2016 / 13:21
4

Embora o seu f2 não pareça estar estritamente ordenado, join parece funcionar 1 :

$ join -t\: -12 -21 -a2 -e 'not found' -o1.1,0 f1 f2
hari:1.2.3.4/32
abc:3.4.5.6/24
bcd:8.9.10.11/34
not found:10.12.34.0/22
not found:1.4.5.7/34

Com dados reais, talvez seja necessário classificar antecipadamente:

$ join -t\: -12 -21 -a2 -e 'not found' -o1.1,0 <(sort -t\: -k2,2 f1) <(sort -t\: -k1,1 f2) | sort
abc:3.4.5.6/24
bcd:8.9.10.11/34
hari:1.2.3.4/32
not found:10.12.34.0/22
not found:1.4.5.7/34


1 talvez porque as linhas matchable estão classificadas?

    
por steeldriver 06.09.2016 / 14:37