34

私は2つのファイルを持っています。最初のファイルには、データベース内のテーブルのタプルの行 ID のリストが含まれています。2 番目のファイルには、クエリの「where」句にこれらの行 ID を持つ SQL クエリが含まれています。

例えば:

ファイル 1

1610657303
1610658464
1610659169
1610668135
1610668350
1610670407
1610671066

ファイル 2

update TABLE_X set ATTRIBUTE_A=87 where ri=1610668350;
update TABLE_X set ATTRIBUTE_A=87 where ri=1610672154;
update TABLE_X set ATTRIBUTE_A=87 where ri=1610668135;
update TABLE_X set ATTRIBUTE_A=87 where ri=1610672153;

ファイル 1 を読み取り、ファイル 1 の行 ID に一致するすべての SQL コマンドをファイル 2 で検索し、それらの SQL クエリを 3 番目のファイルにダンプする必要があります。

ファイル 1 には 1,00,000 エントリがあり、ファイル 2 にはファイル 1 の 10 倍のエントリ、つまり 1,00,0000 が含まれています。

使用しgrep -f File_1 File_2 > File_3ました。しかし、これは非常に遅く、速度は 1 時間あたり 1000 エントリです。

これを行うより速い方法はありますか?

4

8 に答える 8

54

正規表現は必要ないので、grep -F -f file1 file2

于 2013-06-21T11:53:48.793 に答える
1

Perl、Ruby、Python などのプログラミング言語を使用することをお勧めします。

Ruby では、両方のファイル (f1f2) を一度だけ読み取るソリューションは次のようになります。

idxes = File.readlines('f1').map(&:chomp)

File.foreach('f2') do | line |
  next unless line =~ /where ri=(\d+);$/
  puts line if idxes.include? $1
end

またはPerlで

open $file, '<', 'f1';
while (<$file>) { chomp; $idxs{$_} = 1; }
close($file);

open $file, '<', 'f2';
while (<$file>) {
    next unless $_ =~ /where ri=(\d+);$/;
    print $_ if $idxs{$1};
}
close $file;
于 2013-06-21T12:08:17.763 に答える
0

以前の回答のほとんどは正しいですが、私にとってうまくいったのはこのコマンドだけでした

grep -oi -f a.txt b.txt

ここに画像の説明を入力

于 2018-08-16T17:22:58.853 に答える
-1

多分AWKを試して、ファイル1の番号をキーとして使用して、単純なスクリプトを例にします

最初のスクリプトは awk スクリプトを生成します:
awk -f script1.awk

{
   print "\$0 ~ ",$0,"{ print \$0 }" > script2.awk;
 }

次に、ファイルを指定して script2.awk を呼び出します

于 2013-06-21T11:35:16.603 に答える