Se os arquivos estão classificados (as amostras que você postou são) então é tão simples quanto
join -t : File1.txt File2.txt
join
pares de linhas de dois arquivos em que o campo de junção é igual. Por padrão, o campo de junção é o primeiro campo, os campos são exibidos em ordem, exceto que o campo de junção não é repetido e as linhas não pareadas são ignoradas, o que é exatamente o que você deseja.
Observe que, se os arquivos tiverem finais de linha do Windows , eles aparecerão em sistemas Unix para obter um retorno de carro extra personagem no final de cada linha. O CR é visualmente invisível, mas no que diz respeito a join
e outras ferramentas de texto, é um personagem como qualquer outro, e isso significa que os campos de File1.txt
terminam com um CR, enquanto os de File2.txt
não para que eles não combinem. Você precisa remover o CR, pelo menos em File1.txt
.
<File1.txt tr -d '\r' | join -t : - File2.txt
Você precisa classificar os arquivos. Se não estiverem, então ksh / bash / zsh, você pode usar substituições de processos. (Adicione tr -d '\r' |
, se necessário.)
join -t : <(sort File1.txt) <(sort File2.txt)
Em sh simples, se sua variante Unix tiver /dev/fd
(a maioria faz), você pode usá-la para canalizar a saída de dois programas por meio de dois descritores de arquivo.
sort File2.txt | { sort File1.txt | join -t : /dev/fd/0 /dev/fd/3; } 3<&1
Se você precisar preservar a ordem original de File1.txt
e ela não estiver classificada pelo campo de associação, adicione números de linha para lembrar o pedido original, classifique pelo campo de associação, junte-se, classifique por números de linha e retire os números de linha. (Você pode fazer algo semelhante se quiser preservar a ordem do outro arquivo.)
<File1.txt nl -s : |
sort -t : -k 2 |
join -t : -1 2 - <(sort File2.txt) |
sort -t : -k 2,2n |
cut -d : -f 1,3