Usando o grep / awk / sed para ordenar e combinar 2 arquivos

4

Estou usando um log de wifi que tem endereços MAC listados nele. Eu quero descobrir quais fabricantes / fabricantes de MAC para os dispositivos que estão conectados ao meu roteador. Eu tenho 2 arquivos, um com os MACs já 'grep' para mostrar os primeiros 3 octetos para o MAC. O outro arquivo tem uma lista de fornecedores e seus primeiros 3 octetos foram emitidos. Neste momento, o problema é que o primeiro arquivo tem várias duplicatas que eu ainda posso igualar no segundo arquivo, mas não mostrará quantas ele tem no primeiro arquivo. Abaixo estão os exemplos.

text.txt

00:10:f6
00:10:f6
03:48:03
8f:91:34
93:ab:c6

vendor.xml

03:48:03 vendor="apple"
00:10:f6 vendor="micro"
8f:91:34 vendor="dell"
93:ab:c6 vendor="sun"
23:8b:23 vendor="acer"
00:73:ad vendor="asus"

Isso é o que recebo quando executo o seguinte código:

cat text.txt vendor.xml |grep -Ff text.txt vendor.xml |sort -u |uniq -c >> final.txt

final.txt

  1 00:10:f6 vendor="micro"
  1 03:48:03 vendor="apple"
  1 8f:91:34 vendor="dell"
  1 93:ab:c6 vendor="sun"

O resultado deve ser:

  2 00:10:f6 vendor="micro"
  1 03:48:03 vendor="apple"
  1 8f:91:34 vendor="dell"
  1 93:ab:c6 vendor="sun"

Existe alguma bandeira ou opção que não estou pensando?

    
por judgemstr 25.10.2014 / 02:48

3 respostas

8

join combina os arquivos (precisando de entradas classificadas):

$ join <(sort text.txt) <(sort vendor.xml)
00:10:f6 vendor="micro"
00:10:f6 vendor="micro"
03:48:03 vendor="apple"
8f:91:34 vendor="dell"
93:ab:c6 vendor="sun"

Então, tudo o que resta é adicionar uniq -c para fazer a contagem:

$ join <(sort text.txt) <(sort vendor.xml) | uniq -c
      2 00:10:f6 vendor="micro"
      1 03:48:03 vendor="apple"
      1 8f:91:34 vendor="dell"
      1 93:ab:c6 vendor="sun"
    
por 25.10.2014 / 03:11
4

Aqui está uma resposta do awk:

awk 'NR==FNR {count[$0]++; next} $1 in count {print count[$1],$0}' text.txt vendor.xml | sort -nr
    
por 25.10.2014 / 03:11
2

Seus dois primeiros comandos não estão fazendo nada. Você está catando os dois arquivos e passando-os para o grep, que está ignorando-o, já que você deu a ele um arquivo para pesquisar. Você só precisava

grep -Ff text.txt vendor.xml | sort -u | uniq -c

Isso não funciona da maneira esperada porque grep é mais inteligente do que isso. Quando você der uma lista de padrões para procurar, ele irá ignorar duplicatas. Isso significa que ele imprime apenas uma linha para os dois 00:10:f6 in text.txt :

$ grep -Ff text.txt vendor.xml 
03:48:03 vendor="apple"
00:10:f6 vendor="micro"
8f:91:34 vendor="dell"
93:ab:c6 vendor="sun"

Quanto ao que você estava tentando fazer, outros já lhe deram sugestões muito boas, mas aqui está uma perl:

$ perl -lane '$#F>0 ? $k{$F[0]} && print "$k{$F[0]} $_" : $k{$_}++;' text.txt vendor.xml 
1 03:48:03 vendor="apple"
2 00:10:f6 vendor="micro"
1 8f:91:34 vendor="dell"
1 93:ab:c6 vendor="sun"   
    
por 25.10.2014 / 04:51