ファイルa.txt
には約10万語あり、各語は新しい行にあります
july.cpp
windows.exe
ttm.rar
document.zip
ファイルにはb.txt
150,000 語が含まれ、1 行に 1 語ずつあります。一部の語はファイルからのものですa.txt
が、一部の語は新しいものです。
july.cpp
NOVEMBER.txt
windows.exe
ttm.rar
document.zip
diary.txt
これらのファイルを 1 つに結合し、重複する行をすべて削除し、新しい行 ( に存在するa.txt
が には存在しない行b.txt
、およびその逆) を保持するにはどうすればよいでしょうか。
答え1
これを行うには、 というコマンドがあります: 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
ファイルに期待どおりの行が追加されます。
答え2
以下は、以下の短い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)
答え3
#!/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)
答え4
coreutilscomm
コマンドを見てみましょう -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
)