Как удалить слова из txt-файла, который существует в другом txt-файле?

Файл a.txt имеет около 100 тыс. слов, каждое слово находится в новой строке

july.cpp
windows.exe
ttm.rar
document.zip

Файл b.txt имеет 150k слов, одно слово за строкой - некоторые слова из файла a.txt, но некоторые слова новы:

july.cpp    
NOVEMBER.txt    
windows.exe    
ttm.rar    
document.zip    
diary.txt

Как объединить эти файлы в один, удалить все повторяющиеся строки и сохранить новые строки (строки, которые существуют в a.txt, но не существуют в b.txt и наоборот)?

1
задан 26 July 2014 в 19:07

4 ответа

Для этого есть команда: comm. Как указано в man comm, это просто:

   comm -3 file1 file2
          Print lines in file1 not in file2, and vice versa.

Обратите внимание, что comm ожидает, что содержимое файлов будет отсортировано, поэтому вы должны отсортировать их перед вызовом comm на них, точно так же :

sort unsorted-file.txt > sorted-file.txt

Итак, чтобы подвести итог:

sort a.txt > as.txt

sort b.txt > bs.txt

comm -3 as.txt bs.txt > result.txt

После вышеприведенных команд у вас будут ожидаемые строки в файле result.txt.

13
ответ дан 24 May 2018 в 05:16
  • 1
    спасибо, это работает как шарм. PS. to zdjęcie z tłuczkiem na Twoim profilu jest fajne ;-) – Kate-Kasia 26 July 2014 в 03:18

Вот короткий скрипт python3, основанный на ответе Джермера, который должен выполнить это, сохранив несортированный порядок b.txt.

#!/usr/bin/python3

with open('a.txt', 'r') as afile:
    a = set(line.rstrip('\n') for line in afile)

with open('b.txt', 'r') as bfile:
    for line in bfile:
        line = line.rstrip('\n')
        if line not in a:
            print(line)
            # Uncomment the following if you also want to remove duplicates:
            # a.add(line)
2
ответ дан 24 May 2018 в 05:16
[F1]
1
ответ дан 24 May 2018 в 05:16
  • 1
    Человек, вы стреляете в комара с морской пушкой! – user 26 July 2014 в 03:11
  • 2
    Человек, вы стреляете в комара с морской пушкой! – user 26 July 2014 в 03:11
  • 3
    Человек, вы стреляете в комара с морской пушкой! – user 26 July 2014 в 03:11
  • 4
    Человек, вы стреляете в комара с морской пушкой! – user 26 July 2014 в 03:11
  • 5
    Человек, вы стреляете в комара с морской пушкой! – user 26 July 2014 в 03:11
  • 6
    Человек, вы стреляете в комара с морской пушкой! – user 26 July 2014 в 03:11
  • 7
    :-) Ты прав. Я пропустил 'k' в 100k – Germar 26 July 2014 в 03:14

Посмотрите на команду coreutils comm - man comm

NAME
       comm - compare two sorted files line by line

SYNOPSIS
       comm [OPTION]... FILE1 FILE2

DESCRIPTION
       Compare sorted files FILE1 and FILE2 line by line.

       With  no  options,  produce  three-column  output.  Column one contains
       lines unique to FILE1, column two contains lines unique to  FILE2,  and
       column three contains lines common to both files.

       -1     suppress column 1 (lines unique to FILE1)

       -2     suppress column 2 (lines unique to FILE2)

       -3     suppress column 3 (lines that appear in both files)

Так, например, вы можете сделать

$ comm -13 <(sort a.txt) <(sort b.txt)
diary.txt
NOVEMBER.txt

(строки, уникальные для b.txt )

1
ответ дан 24 May 2018 в 05:16

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

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