Как извлечь необычный нечувствительный к регистру текст из двух файлов?

Я пытаюсь извлечь необычный текст из файла, и я пробовал это:

awk 'FNR==NR {a[$0]++; next} !a[$0]' 1.txt 2.txt
http://PQR.com
http://example.com

Вот входные файлы:

File: 1.txt
http://google.com
http://GOOGLE.com
http://example1.com
http://seperate.com
http://pqr.com
File: 2.txt
http://PQR.com
http://example.com
http://google.com

Как вы можете видеть, http://pqr.com доступен в файлах 1.txt и http://PQR.com в 2.txt. и отображение результатов http://PQR.com, что является общим в обоих файлах. Следовательно, как я могу показать только необычный текст (не зависящий от случаев текста)?

1
задан 6 February 2017 в 12:31

2 ответа

Это довольно простая задача для grep:

grep -viFf file2.txt file1.txt
-v показывает, что строки, которые не соответствуют -i, позволяют нечувствительность к регистру -F делает шаблоны литеральными -f file1.txt читает шаблоны в соответствии с file1.txt, строка за строкой

Пример:

% cat file1.txt 
http://google.com
http://GOOGLE.com
http://example1.com
http://seperate.com
http://pqr.com

% cat file2.txt 
http://PQR.com
http://example.com
http://google.com

% grep -viFf file2.txt file1.txt
http://example1.com
http://seperate.com
4
ответ дан 23 May 2018 в 01:44
  • 1
    Ваша команда показала aims@aims:~/Downloads/Uncommon1$ grep -viFf 2.txt 1.txt > output.txt grep: memory exhausted – Jaffer Wilson 6 February 2017 в 13:26
  • 2
    Посмотрите на размер файла, grep задыхается в размерах файлов, подобных этому. – Jacob Vlijm 6 February 2017 в 13:49

Вот решение Python, использующее эффективную реализацию набора для хорошей производительности O (n + m) (при этом n и m являются размерами двух входных файлов).

Код

#!/usr/bin/python3
import sys

with open(sys.argv[1]) as A_file:
    A = frozenset(map(str.casefold, map(str.rstrip, A_file)))

with open(sys.argv[2]) as B_file:
    B = map(str.rstrip, B_file))
    B_minus_A = filter(lambda s: s.casefold() not in A, B)
    print(*B_minus_A, sep='\n')

Пример использования

python3 casefold-difference.py 1.txt 2.txt

Объяснение

Программа использует casefold для сравнения строк, но возвращает строки, как они появляются в 2.txt. Складывание случая - это рекомендуемый способ сделать нечувствительное к регистру сравнение естественного языка. Если это не то, что вы хотите (поскольку URL-адреса на самом деле не являются естественным языком), вы можете заменить его на lower. Если 2.txt имеет огромное количество строк (которые не отображаются в 1.txt), создание списка вариационных аргументов в последнем утверждении может потреблять довольно много памяти, и вам может быть лучше заменить его на петля вот так:
for item in B_minus_A:
    print(item)
4
ответ дан 23 May 2018 в 01:44

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

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