Как я могу получить имена, содержащиеся в первом файле, которые не являются i?

Протестировал esc + d и alt / opt + d на OSX Mavericks, и они там тоже работают.

1
задан 19 September 2014 в 18:37

3 ответа

Если они отсортированы и разделены символами новой строки, вы можете использовать comm показать строки, которые уникальны для файла1:

comm -23 file1 file2

Демонстрация:

$ comm -23 <(echo -e 'john\nmike\nanna\npaul\nlaura'|sort) <(echo -e 'john\nmike\npaul'|sort)
anna
laura

Или вы могли бы diff сделать то же самое (grep ищет удаление строк):

diff sorted-file-1 sorted-file-2 | grep -oP '(?<=< ).+'

Если вам нужно избегать сортировки или вы имеете дело с серьезными цифрами , Я бы перешел на правильный язык для поиска на основе словаря. Простой пример python:

file2 = {}
with open("file2") as f:
    for line in f:
        file2[line] = 0

with open("file1") as f:
    for line in f:
        if not line in file2:
            print line

Все, что больше, и вы можете посмотреть фактическую базу данных и некоторый простой SQL. Они предназначены для больших данных.

2
ответ дан 24 May 2018 в 03:34

И параметр python: независимо от того, все ли слова находятся в одной строке или в отдельных строках:

#!/usr/bin/env python3

import sys

f1 = sys.argv[1]; f2 = sys.argv[2]

def read(f):
    with open(f) as content:
        return content.read().split()

for item in [w for w in read(f1) if not w in read(f2)]:
    print(item)

Скопируйте сценарий в пустой файл, сохраните его как showdiff.py, выполнив его и запустите это по команде:

/path/to/showdiff.py file1 file2

anna
laura

Примечание

Не вопрос, но слишком много связано с отсутствием:

Если вам нужно перечислить различия взаимно , (а не только слова из file1, которые не фигурируют в file2, но также слова в file2, которые не отображаются в file1). Необходимо использовать следующий сценарий:

#!/usr/bin/env python3

import sys

f1 = sys.argv[1]; f2 = sys.argv[2]

def read(f):
    with open(f) as content:
        return content.read().split()

wds1 = read(f1); wds2 = read(f2); allwords = wds1+wds2
for item in [w for w in allwords if (w in wds1, w in wds2).count(False) == 1]:
    print(item)
2
ответ дан 24 May 2018 в 03:34

Если вы перейдете к опции python, как предложено Jacob Vlijm, стоит использовать «set» (дополнительную информацию см. на странице https://docs.python.org/3/library/stdtypes.html#set-types -set-frozenset). В принципе, как только вы создали два набора, вы можете достичь заданной математики (объединение, пересечение, разность и т. Д.). В этом случае заданная разность - это именно то, что вам нужно: новый набор со всеми элементами, которые находятся в одном наборе и а не в другом. Тогда код из Джейкоба будет:

#!/usr/bin/env python3

import sys

f1 = sys.argv[1]; f2 = sys.argv[2]

def read_set(f):
    with open(f) as content:
        return set(content.read().split())

for item in read_set(f1) - read_set(f2)]:
    print(item)

Конечно, для миллиардов записей это займет некоторое время ... `

0
ответ дан 24 May 2018 в 03:34

Другие вопросы по тегам:

Похожие вопросы: