Wie lösche ich Wörter aus der TXT-Datei, die in einer anderen TXT-Datei existiert?

8

Datei a.txt hat ungefähr 100k Wörter, jedes Wort ist in einer neuen Zeile

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

Datei b.txt hat 150k Wörter, ein Wort für Zeile - einige Wörter stammen von 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 zusammenfassen, alle doppelten Zeilen löschen und Zeilen behalten, die neu sind (Zeilen, die in a.txt existieren, aber nicht in b.txt existieren, und umgekehrt)?

    
Kate-Kasia 25.07.2014, 23:33

4 Antworten

13

Dafür gibt es einen Befehl: comm . Wie in man comm angegeben, ist es ganz einfach:

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

Beachten Sie, dass comm erwartet, dass Dateiinhalte sortiert werden. Sie müssen sie also vor dem Aufruf von comm für sie sortieren, einfach so:

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

Also zusammenfassend:

sort a.txt > as.txt

sort b.txt > bs.txt

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

Nach obigen Befehlen haben Sie Zeilen in der Datei result.txt erwartet.

    
user280493 26.07.2014, 00:06
2

Hier ist ein kurzes Python3-Skript, das auf der Germar-Antwort basiert und das unter Beibehaltung von b.txt 's erreichen soll unsortierte Reihenfolge.

#!/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)
    
ikdc 26.07.2014 03:39
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 26.07.2014 00:09
1

Sehen Sie sich den Befehl coreutils comm - man comm

an
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, die für b.txt eindeutig sind)

    
steeldriver 26.07.2014 00:11

Tags und Links