Wie lösche ich Wörter aus einer txt-Datei, die in einer anderen txt-Datei vorhanden ist?

8

Die Datei a.txtenthält ungefähr 100.000 Wörter. Jedes Wort befindet sich in einer neuen Zeile

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

Datei b.txthat 150k Wörter, ein Wort für Zeile - einige Wörter stammen aus der Datei a.txt, aber einige Wörter sind neu:

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

Wie kann ich diese Dateien zu einer zusammenführen, alle doppelten Zeilen löschen und neue Zeilen beibehalten (Zeilen, die in vorhanden sind, a.txtaber nicht vorhanden sind b.txt, und umgekehrt)?

Kate-Kasia
quelle
Würden Sie gerne Python verwenden?
Tim
2
@ MikołajBartnicki Unix.SE wäre wahrscheinlich ein besserer Ort, um zu fragen
Glutanimate
1
Kasia, ich habe einen Fehler in meiner Antwort gemacht, deshalb habe ich ihn gelöscht. Ich arbeite an einem neuen.
2
@Glutanimate Diese Frage ist hier vollkommen in Ordnung.
Seth
1
@Glutanimate Ah, es tut mir leid, ich habe diesen Kommentar irgendwie verpasst.
Seth

Antworten:

13

Hierzu gibt es einen Befehl : comm. Wie in angegeben man comm, ist es ganz einfach:

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

Beachten Sie, dass commerwartet wird, dass der Dateiinhalt sortiert wird. Sie müssen ihn also sortieren, bevor Sie ihn aufrufen comm:

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

Um es zusammenzufassen:

sort a.txt > as.txt

sort b.txt > bs.txt

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

Nach den obigen Befehlen haben Sie erwartete Zeilen in der result.txtDatei.


quelle
Danke, es funktioniert wie ein Zauber. PS. zu zdjęcie z tłuczkiem na Twoim profilu jest fajne ;-)
Kate-Kasia
2

Hier ist ein kurzes Python3-Skript, das auf Germars Antwort basiert und dies unter Beibehaltung b.txtder unsortierten Reihenfolge erreichen soll.

#!/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
quelle
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
quelle
2
Mann, du schießt eine Mücke mit einer Marinekanone!
:-) Du hast recht. Ich habe das 'k' in 100k verpasst
Germar
1

Schauen Sie sich den commBefehl coreutils an -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)

So können Sie zum Beispiel tun

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

(Zeilen einzigartig für b.txt)

Steeldriver
quelle