El archivo a.txt
tiene alrededor de 100.000 palabras, cada palabra está en una nueva línea.
july.cpp
windows.exe
ttm.rar
document.zip
El archivo b.txt
tiene 150.000 palabras, una palabra por línea; algunas palabras son del archivo a.txt
, pero algunas palabras son nuevas:
july.cpp
NOVEMBER.txt
windows.exe
ttm.rar
document.zip
diary.txt
¿Cómo puedo fusionar estos archivos en uno, eliminar todas las líneas duplicadas y conservar las líneas nuevas (líneas que existen a.txt
pero que no existen b.txt
y viceversa)?
Respuesta1
Hay un comando para hacer esto: comm
. Como se indica en man comm
, es muy simple:
comm -3 file1 file2
Print lines in file1 not in file2, and vice versa.
Tenga en cuenta que comm
espera que el contenido de los archivos esté ordenado, por lo que debe ordenarlos antes de llamarlos comm
, así como así:
sort unsorted-file.txt > sorted-file.txt
Así que para resumir:
sort a.txt > as.txt
sort b.txt > bs.txt
comm -3 as.txt bs.txt > result.txt
Después de los comandos anteriores, habrá líneas esperadas en el result.txt
archivo.
Respuesta2
Aquí hay un breve script de Python3, basado enLa respuesta de Germar., que debería lograr esto manteniendo b.txt
el orden sin clasificar.
#!/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)
Respuesta3
#!/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)
Respuesta4
Eche un vistazo al comm
comando 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)
Entonces, por ejemplo, puedes hacer
$ comm -13 <(sort a.txt) <(sort b.txt)
diary.txt
NOVEMBER.txt
(líneas exclusivas de b.txt
)