0

2つのファイルがあります。1つはIPとホスト情報を含む「マスターリスト」で、もう1つはIPとユーザーエージェント文字列で動的に入力されます。以下の例を参照してください。

サンプルファイル1:

24.143.206.32   Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)
66.39.66.63     Dalvik/1.6.0 (Linux; U; Android 4.2.1; Nexus 7 Build/JOP40D)

サンプルファイル2:

24.143.206.32 # New Host US,city,44.8824996948,-99.6440963745
66.39.66.63 # New Host US,city,44.8824996948,-99.6440963745
and on and on

2つのAND出力の一致と両方の末尾の情報とのIP一致を見つける必要があります。

24.143.206.32 Browser: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0) LOCATION: New Host US,city,44.8824996948,-99.6440963745

66.39.66.63  Browser: Dalvik/1.6.0 (Linux; U; Android 4.2.1; Nexus 7 Build/JOP40D) LOCATION: New Host US,city,44.8824996948,-99.6440963745

現在、私はこれをIPマッチに使用しています。

awk 'FNR==NR{ a[$1]=$0;next } ($1 in a)' file1 file2 > matchesfile

私は何度も何度も試しましたが、必要なすべての情報を取得できません。何か助けを提供できますか、それともこれは複雑すぎますか?これで進むべき方向がわかりません。

4

4 に答える 4

1

これは私がそれをする方法です:

  • すべての行について、最初のフィールドのIPアドレスを保存し、それを行から削除します。
  • 最初のファイルの各行について、ブラウザの詳細をIPアドレスでキー設定された配列に格納します。
  • 後続のファイルの各行について、配列にIPアドレスが見つかった場合は、IPアドレス、それに関連付けられているブラウザ、およびその行にあるその他のものを含むフォーマットされた文字列を出力します。

例:

% awk ' {
    IP = $1
    $1 = ""
}
FNR == NR {
    browser[IP] = $0
}
FNR != NR && IP in browser {
    printf "%s Browser:%s Location:%s\n", IP, browser[IP], $0
}
' file[12]
24.143.206.32 Browser: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0) Location: # New Host US,city,44.8824996948,-99.6440963745
66.39.66.63 Browser: Dalvik/1.6.0 (Linux; U; Android 4.2.1; Nexus 7 Build/JOP40D) Location: # New Host US,city,44.8824996948,-99.6440963745
于 2013-02-27T03:12:32.050 に答える
1

両方の出力からのデータが必要な場合は、情報を印刷し、少し異なる方法でテストする必要があると思います。

awk 'FNR == NR { a[$1] = $0; next }
     { if ($1 in a) print $0 " " a[$1] }' file1 file2 > matchesfile

それはあなたが持っていたものにかなり近いです。ただし、印刷は異なります。print $0暗黙的に呼び出しました。awk少なくともGNUでは、条件をパターンとして使用できます。

awk 'FNR == NR { a[$1] = $0; next }
     ($1 in a) { print $0 " " a[$1] }' file1 file2 > matchesfile

また、「Browser:」タグと「Location:」タグを出力に入れたい場合は、さらに多くの作業が必要になります。

awk 'FNR == NR { for (i = 2; i < NF; i++) a[$1] = a[$i] " " $i; next }
     ($1 in a) { for (i = 2; i < NF; i++) loc = loc " " $i;
                 print $1 " Browser: " a[$1] " Location: " loc }
    ' file1 file2 > matchesfile

最初のforループfile1は、IPアドレスの後のブラウザフィールドをに連結しa[$1]ます。2番目のforループは、からfile2変数への位置情報についても同じことを行いますloc。次にprint、データを吐き出します。要件に合わせてフォーマットを微調整できます。

そして、同じ結果を達成する他の方法があります...

于 2013-02-27T03:13:51.503 に答える
1
awk '
FNR==NR{ a[$1]=$0; next }
$1 in a {
   sub(/[[:space:]]+/,"&Browser: ",a[$1])
   sub(/[^[:space:]]+[[:space:]]+#/,"LOCATION:")
   print a[$1], $0
}
' file1 file2 > matchesfile
于 2013-02-27T03:19:01.717 に答える
0
awk 'FNR==NR{f=$1;$1=$2="";a[f]=$0;next}($1 in a ){$2="Browser: "$2;print $0,a[$1]}' file2 file1
于 2013-02-27T06:06:27.473 に答える