別のtxtファイルに存在するtxtファイルから単語を削除するにはどうすればよいですか?


8

ファイルにa.txtは約10万ワードがあり、各ワードは新しい行にあります

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

ファイルにb.txtは150kワード、1行ごとに1ワードあります。一部のワードはファイルからのものですa.txtが、一部のワードは新しいものです。

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

このファイルを1つにマージし、重複する行をすべて削除して、新しい行(には存在するa.txtが存在しない行b.txt、およびその逆)を保持するにはどうすればよいですか?


Pythonを使用してよろしいですか?
Tim

2
@MikołajBartnicki Unix.SEはおそらく依頼するより良い場所でしょう
Glutanimate

1
カシア、答えを間違えたので削除しました。私は新しいものに取り組んでいます。

2
@グルタニメートこの質問はここで完全に問題ありません。
Seth

1
@グルタニメートあ、ごめんなさい、どういうわけかそのコメントを逃しました。
Seth

回答:


13

これを行うコマンドがあります:comm。で述べたようにman comm、それは非常に単純です:

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

commはファイルの内容がソートされることを想定していることに注意してください。そのため、呼び出す前commにそれらをソートする必要があります。

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

要約すると:

sort a.txt > as.txt

sort b.txt > bs.txt

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

上記のコマンドを実行すると、result.txtファイルに予期した行が表示されます。


ありがとう、それは魅力のように働きます。PS。tozdjęcieztłuczkiemna Twoim profilu jest fajne ;-)
Kate-Kasia

2

これは、Germarの回答に基づく短いpython3スクリプトです。これは、の並べ替えられてb.txtいない順序を維持しながらこれを達成する必要があります。

#!/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)

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)

2
男、あなたは海軍大砲で蚊を撃っています!

:-) あなたが正しい。100kの「k」を逃した
Germar

1

coreutils commコマンドを見てください-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)

たとえば、次のことができます

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

(に固有の行b.txt

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.