2つのテキストファイルがあります。ファイル2には1,000,000を超えるログがあります。ファイル 1 には IP アドレスが 1 行ずつ含まれています。ファイル2行を読み、ファイル1から次の行を検索したいと思います。つまり、次のようになります。
ファイル1:
34.123.21.32
45.231.43.21
21.34.67.98
ファイル2:
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のIPをファイル2から1行ずつ検索し、時間パラメータ(例:0.326)を新しいファイルに印刷したいと思います。
どうすればいいですか?
ベストアンサー1
結合+ソート
両方に存在するIPを見つけたい場合は、そのコマンドを使用できますが、ファイルを結合する前にそのコマンドを使用してファイルを事前にソートする必要がありますjoin
。sort
$ join -o 2.2 <(sort file1) <(sort file2)
はい
$ join -o 2.2 <(sort file1) <(sort file2)
1.765
0.326
4.754
3.673
6.334
他の例
ファイル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
文書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]
実行join
コマンド:
$ join -o 2.2 <(sort file1) <(sort file2)
1.234
1.765
0.326
4.754
3.673
6.334
メモ:file2
最初にソートしたため、この方法を使用すると元の順序が失われます。ただし、結果として、この方法ではfile2
今回のスキャンのみが必要です。
grep
行を使用してgrep
一致するものを検索できますが、この方法は私が示した最初の方法ほど効率的ではありません。検索のすべての行を検索します。file2
file1
file2
file1
$ grep -f file1 file2 | awk '{print $2}'
はい
$ grep -f file1 file2 | awk '{print $2}'
0.326
6.334
3.673
4.754
1.765
1.234
grep パフォーマンスの向上
grep
次の形式を使用すると、パフォーマンスを高速化できます。
$ LC_ALL=C grep -f file1 file2 | awk '{print $2}'
grep
また、脊椎がfile1
固定長()であることがわかります。-F
これはより良いパフォーマンスを得るのに役立ちます。
$ LC_ALL=C grep -Ff file1 file2 | awk '{print $2}'
一般に、ソフトウェアで言うと、このアプローチは基本的にループ型ソリューション内のループなので避けたいと思います。しかし、時にはコンピュータ+ソフトウェアを使用して最良の結果を得ることができます。