0

我有两个输入文件,例如:

file1
123
456
789

file2
123|foo
456|bar
999|baz

我需要从 file2 中复制其键在 file1 中的行,所以最终结果是:

file3
123|foo
456|bar

现在,我正在使用一个 shell 脚本,它遍历它们的密钥文件并为每个文件使用 grep:

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

但正如您可以想象的那样,这是非常缓慢的。密钥文件 (file1) 有大约 400,000 个密钥,数据文件 (file2) 有大约 750,000 行。有一个更好的方法吗?

4

3 回答 3

4

您可以尝试使用join

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

join是最好的解决方案,如果排序是好的。一个 awk 解决方案:

awk -F \| '
    FILENAME==ARGV[1] {key[$1];next} 
    $1 in key
' file1 file2
于 2013-01-25T00:34:40.560 回答
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 回答