Die Datei a.txt
hat etwa 100.000 Wörter, jedes Wort steht in einer neuen Zeile
july.cpp
windows.exe
ttm.rar
document.zip
Die Datei b.txt
enthält 150.000 Wörter, ein Wort pro 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 behalten (Zeilen, die in vorhanden sind, a.txt
aber nicht vorhanden sind b.txt
, und umgekehrt)?
Antwort1
Dafür gibt es einen Befehl: comm
. Wie in beschrieben man comm
, ist es ganz einfach:
comm -3 file1 file2
Print lines in file1 not in file2, and vice versa.
Beachten Sie, dass comm
der Inhalt der erwarteten Dateien sortiert sein muss. Sie müssen sie also vor dem Aufruf sortieren comm
, und zwar so:
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 verfügen Sie über die erwarteten Zeilen in der result.txt
Datei.
Antwort2
Hier ist ein kurzes Python3-Skript, basierend aufGermars Antwort, wodurch dies unter Beibehaltung b.txt
der unsortierten Reihenfolge erreicht werden sollte.
#!/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)
Antwort3
#!/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)
Antwort4
Schauen Sie sich den comm
Befehl 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
$ comm -13 <(sort a.txt) <(sort b.txt)
diary.txt
NOVEMBER.txt
(Zeilen, die eindeutig sind für b.txt
)