Como imprimo todos os registros no arquivo 1, mas observe os registros que não correspondem ao arquivo2?

1

Existe uma maneira fácil de imprimir todas as linhas de file1 (para que a saída tenha o mesmo número de linhas que a entrada file1 ), mas imprima uma mensagem como NoMatch em que as primeiras entradas do arquivo1 não corresponde às primeiras entradas de file2 ?

arquivo1:

Entry1 Entry2
a 2
b 3
c 4
d 5

arquivo2:

a
b
b
a
d
d

Saída desejada:

Entry1
a 2
b 3
NoMatch 4
d 5

Estou tentando com

join -a1 -e "NoMatch" -11 -21 -o2.1 file1 file2

desde que eu gostaria de manter as linhas não parciais de file1 que não correspondem a file2 , e dar uma mensagem para esses casos como "não", mas isso mantém todos os meus registros também em file2 (que contém registros duplicados), o que estou fazendo errado? Isso poderia ser porque meu segundo arquivo é delimitado por tabulações e meu primeiro arquivo é delimitado por espaço?

Muito obrigado por toda a ajuda ...

    
por jamespower 04.12.2015 / 02:04

1 resposta

2

Com awk leia file2 primeiro e economize $1 em seen[$1] , em seguida, leia file1 e, se $1 não foi "visto", substitua-o por NoMatch :

awk 'FNR==NR{seen[$1]++; next}
{(FNR==1 || ($1 in seen)) || $1="NoMatch"};1' file2 file1

Se você preferir join , precisará de entrada classificada. Você terá que extrair o head er de file1 first, sort as linhas restantes e então join o resultado com o sort ed file2 :

{ head -n1; sort | join -j1 -a1 -e "NoMatch" -o 2.1 1.2 - <(sort file2); } <file1

e, se necessário, canalize tudo para uniq para evitar linhas duplicadas:

{ head -n 1; sort | \
join -j1 -a1 -e "NoMatch" -o 2.1 1.2 - <(sort file2) | \
uniq; } <file1
    
por 04.12.2015 / 14:46