Comment supprimer des mots d'un fichier txt, qui existe sur un autre fichier txt?

8

Le fichier a.txtcontient environ 100 000 mots, chaque mot est sur une nouvelle ligne

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

Le fichier b.txtcontient 150 000 mots, un mot par ligne - certains mots proviennent du fichier a.txt, mais certains mots sont nouveaux:

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

Comment puis-je fusionner ces fichiers en un seul, supprimer toutes les lignes en double et conserver les lignes qui sont nouvelles (lignes qui existent dans a.txtmais n'existent pas dans b.txt, et vice versa)?

Kate-Kasia
la source
Seriez-vous heureux d'utiliser python?
Tim
2
@ MikołajBartnicki Unix.SE serait probablement un meilleur endroit pour demander
Glutanimate
1
Kasia, j'ai fait une erreur dans ma réponse, c'est pourquoi je l'ai supprimée. Je travaille sur un nouveau.
2
@Glutanimate Cette question est parfaitement bien ici.
Seth
1
@Glutanimate Ah, je suis désolé, j'ai raté ce commentaire d'une manière ou d'une autre.
Seth

Réponses:

13

Il y a une commande pour ce faire: comm. Comme indiqué dans man comm, c'est simple:

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

Notez que le commcontenu des fichiers doit être trié, vous devez donc les trier avant de les appeler comm, comme ceci:

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

Pour résumer:

sort a.txt > as.txt

sort b.txt > bs.txt

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

Après les commandes ci-dessus, vous aurez des lignes attendues dans le result.txtfichier.


la source
merci, ça marche comme un charme. PS. à zdjęcie z tłuczkiem na Twoim profilu jest fajne ;-)
Kate-Kasia
2

Voici un court script python3, basé sur la réponse de Germar , qui devrait accomplir cela tout en conservant b.txtl'ordre non trié de.

#!/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)
Lily Chung
la source
1
#!/usr/bin/env python3

with open('a.txt', 'r') as f:
    a_txt = f.read()
a = a_txt.split('\n')
del(a_txt)

with open('b.txt', 'r') as f:
    while True:
        b = f.readline().strip('\n ')
        if not len(b):
            break
        if not b in a:
            print(b)
Germar
la source
2
Mec, vous tirez sur un moustique avec un canon naval!
:-) Tu as raison. J'ai raté le 'k' en 100k
Germar
1

Jetez un oeil à la commcommande coreutils -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)

Ainsi, par exemple, vous pouvez faire

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

(lignes uniques à b.txt)

tournevis
la source