如何从文件中只取出与任何文件(两个或多个文件)中的任何其他单词不匹配的唯一单词?

时间:2017-12-29 10:00:31

标签: shell unix grep

#!/bin/sh
for file1 in directorypath/*
do
    for file2 in directorypath/*
         do
               if [ "$file1" = "$file2" ]; then 
                      echo "files are same"
               else


                                 cp /dev/null /home/temp.txt
                 grep -f $file1 $file2 > /home/common.txt
                 grep -v -x -f /home/common.txt $file1 > /home/temp.txt
                                 cp /dev/null $file1
                                 cat /home/temp.txt >> $file1


                                 cp /dev/null /home/temp.txt
                 grep -v -x -f /home/common.txt $file2 > /home/temp.txt
                                 cp /dev/null $file2
                 cat /home/temp.txt >> $file2

                fi;
         done
done

此代码适用于小尺寸文件。由于我要处理大文本文件,因此即使在服务器计算机上也会占用太多时间。 请帮忙! 如何有效地实现同样的目标? 提前谢谢。

1 个答案:

答案 0 :(得分:0)

试试这个python脚本(将目录作为参数):

import sys
import os

# Keeps a mapping of word => file that contains it
# word => None means that that word exists in multiple files
words = {}

def process_line(file_name, line):
    try:
        other_file = words[line]
        if other_file is None or other_file == file_name:
            return
        words[line] = None
    except KeyError:
        words[line] = file_name

file_dir = sys.argv[1]
for file_name in os.listdir(file_dir):
    with open(os.path.join(file_dir, file_name)) as fd:
        while True:
            line = fd.readline()
            if len(line) == 0:
                break
            line = line.strip()
            if len(line) == 0:
                continue
            process_line(file_name, line)

file_descriptors = {}
# Empty all existing files before writing out the info we have
for file_name in os.listdir(file_dir):
    file_descriptors[file_name] = open(os.path.join(file_dir, file_name), "w")

for word in words:
    file_name = words[word]
    if file_name is None:
        continue
    fd = file_descriptors[file_name]
    fd.write("%s\n" % word)

for fd in file_descriptors.values():
    fd.close()

内存要求:

您需要能够在内存中同时保存所有唯一字词。假设文件之间存在大量欺骗,这应该是可行的。否则,我真的没有比你现有的更快地看到一种方法。

如果您最终无法满足内存中所需的所有内容,请查看this answer,了解为dict使用基于磁盘的解决方案的可能方法,而不是将其全部保存在内存中。我不知道会对性能产生多大影响,以及它在那时仍能保持足够快的运行速度。

为什么它更快?(理论上,未经测试)

它只会对每个文件进行一次传递并完成。您当前的方法是O(n^2),其中n是文件数