Juntar + ordenar
Se você está tentando encontrar IPs que estão presentes em ambos, você pode usar o comando join
, mas precisará usar sort
para pré-ordenar os arquivos antes de associá-los.
$ join -o 2.2 <(sort file1) <(sort file2)
Exemplo
$ join -o 2.2 <(sort file1) <(sort file2)
1.765
0.326
4.754
3.673
6.334
Outro exemplo
arquivo 1a:
$ cat file1a
34.123.21.32
45.231.43.21
21.34.67.98
1.2.3.4
5.6.7.8
9.10.11.12
arquivo 2a:
$ cat file2a
34.123.21.32 0.326 - [30/Oct/2013:06:00:06 +0200]
45.231.43.21 6.334 - [30/Oct/2013:06:00:06 +0200]
45.231.43.21 3.673 - [30/Oct/2013:06:00:06 +0200]
34.123.21.32 4.754 - [30/Oct/2013:06:00:06 +0200]
21.34.67.98 1.765 - [30/Oct/2013:06:00:06 +0200]
1.2.3.4 1.234 - [30/Oct/2013:06:00:06 +0200]
4.3.2.1 4.321 - [30/Oct/2013:06:00:06 +0200]
Executando o comando join
:
$ join -o 2.2 <(sort file1) <(sort file2)
1.234
1.765
0.326
4.754
3.673
6.334
NOTA: A ordem original de file2
é perdida com este método, devido ao fato de que a classificamos primeiro. No entanto, esse método só precisa varrer file2
uma vez, como resultado.
grep
Você pode usar grep
para pesquisar correspondências em file2
usando linhas que estão em file1
, mas esse método não é tão eficiente quanto o primeiro método que mostrei. Está varrendo file2
procurando por cada linha em file1
.
$ grep -f file1 file2 | awk '{print $2}'
Exemplo
$ grep -f file1 file2 | awk '{print $2}'
0.326
6.334
3.673
4.754
1.765
1.234
Melhorando o desempenho do grep
Você pode acelerar o desempenho de grep
usando este formulário:
$ LC_ALL=C grep -f file1 file2 | awk '{print $2}'
Você também pode informar a grep
que as picadas em file1
têm comprimento fixo ( -F
), o que também ajudará a obter um melhor desempenho.
$ LC_ALL=C grep -Ff file1 file2 | awk '{print $2}'
Geralmente, no software, você tenta evitar essa abordagem, já que é basicamente um loop dentro de um tipo de solução de loop. Mas há momentos em que é o melhor que pode ser alcançado usando um computador + software.