0

次のような2つの入力ファイルがあります。

file1
123
456
789

file2
123|foo
456|bar
999|baz

キーがfile1にあるfile2から行をコピーする必要があるため、最終結果は次のようになります。

file3
123|foo
456|bar

現在、キーファイルをループしてそれぞれにgrepを使用するシェルスクリプトを使用しています。

grep "^${keys[$keyindex]}|" $datafile >&4

しかし、ご想像のとおり、これは非常に遅いです。キーファイル(file1)には約400,000のキーがあり、データファイル(file2)には約750,000の行があります。これを行うためのより良い方法はありますか?

4

3 に答える 3

4

参加を使用してみることができます:

join -t'|' file1.txt file2.txt > file3.txt
于 2013-01-24T21:14:31.913 に答える
0

Pythonのようなものを使用します。これは、のような最適化されたデータ型を使用した場合に非常に高速に処理されますset。正確な要件がわからないため、それに応じて調整する必要があります。

#!/usr/bin/python

# Create a set to store all of the items in file1
Set1 = set()
for line in open('file1', 'r'):
   Set1.add(line.strip())

# Open a file to write to
file4 = open('file4', 'w')

# Loop over file2, and only write out the items found in Set1
for line in open('file2', 'r'):
   if '|' not in line: 
      continue

   parts = line.strip().split('|', 1)
   if parts[0] in Set1:
       file4.write(parts[1] + "\n")
于 2013-01-24T21:17:17.843 に答える
0

join並べ替えに問題がない場合は、が最善の解決策です。awkソリューション:

awk -F \| '
    FILENAME==ARGV[1] {key[$1];next} 
    $1 in key
' file1 file2
于 2013-01-25T00:34:40.560 に答える