bashプログラミングはファイルを1行ずつ比較し、新しいファイルを作成します。

bashプログラミングはファイルを1行ずつ比較し、新しいファイルを作成します。

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を見つけたい場合は、そのコマンドを使用できますが、ファイルを結合する前にそのコマンドを使用してファイルを事前にソートする必要がありますjoinsort

$ 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一致するものを検索できますが、この方法は私が示した最初の方法ほど効率的ではありません。検索のすべての行を検索します。file2file1file2file1

$ 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}'

一般に、ソフトウェアで言うと、このアプローチは基本的にループ型ソリューション内のループなので避けたいと思います。しかし、時にはコンピュータ+ソフトウェアを使用して最良の結果を得ることができます。

引用する

おすすめ記事