web-dev-qa-db-ja.com

grep / awk / sedを使用して2つのファイルを並べ替えて結合する

MACアドレスが記載されているwifiログを取得しています。ルーターに接続されているデバイスのMACベンダー/メーカーを知りたいのですが。 2つのファイルがあります。1つはMACの最初の3オクテットを表示するために、すでに「grep」を使用しています。もう1つのファイルには、ベンダーとそれらが発行された最初の3オクテットのリストが含まれています。現在のところ、最初のファイルに複数の重複があり、2番目のファイルでも一致する可能性がありますが、最初のファイルからの重複の数は表示されません。以下に例を示します。

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"

これは、次のコードを実行したときに得られるものです。

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"

結果は代わりになります:

  2 00:10:f6 vendor="micro"
  1 03:48:03 vendor="Apple"
  1 8f:91:34 vendor="Dell"
  1 93:ab:c6 vendor="Sun"

私が考えていないフラグやオプションはありますか?

4
judgemstr

これがawkの答えです:

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

最初の2つのコマンドは何もしていません。 2つのファイルをキャットし、検索するファイルを指定したため無視しているgrepに渡します。必要なのは

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

grepはそれよりも賢いので、それはあなたが期待したようには機能しません。探すパターンのリストを指定すると、重複は無視されます。これは、00:10:f6の2つのtext.txtに対して1行しか出力しないことを意味します。

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

あなたがやろうとしていたことに関しては、他の人がすでにあなたに非常に良い提案をしてくれましたが、これが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"   
1
terdon