Utilisation de grep / awk / sed pour sortinger et combiner 2 files

Je prends un journal de wifi qui a des adresses MAC énumérées dedans. Je veux savoir quels sont les fournisseurs MAC / fabricants pour les appareils qui sont connectés à mon routeur. J'ai 2 files, l'un avec les MAC déjà 'grep' pour afficher les 3 premiers octets pour le MAC. L'autre file a une list de fournisseurs et leurs 3 premiers octets ont été émis. En ce moment, le problème est que le premier file a plusieurs duplicates que je peux toujours faire correspondre dans le deuxième file, mais il ne montrera pas combien il a à partir du premier file. Voici les exemples.

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" 

C'est ce que je reçois quand je cours le code suivant:

 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" 

Le résultat devrait être à la place:

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

Y a-t-il un drapeau ou une option à laquelle je ne pense pas?

join combine les files (nécessitant des inputs sortingées):

 $ 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" 

Donc tout ce qui rest est d'append uniq -c pour faire le comptage:

 $ 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" 

Voici une réponse awk:

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

Vos deux premières commands ne font rien. Vous cattiez les deux files et les transmettez à grep qui l'ignore car vous lui avez donné un file à searchr. Il vous suffisait

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

Cela ne fonctionne pas comme prévu, car grep est plus intelligent que ça. Lorsque vous lui donnez une list de templates à searchr, il ignorera les duplicates. Cela signifie qu'il n'imprime qu'une ligne pour les deux 00:10:f6 dans 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" 

Quant à ce que vous essayiez de faire, d'autres vous ont déjà donné de très bonnes suggestions, mais voici une 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"