grep的具有開關-f
它從文件中讀取的模式。將其與-v
相結合,只打印不匹配的行,並且您有一個優雅的解決方案。由於您的模式是固定字符串,因此在使用-F
時可以顯着提高性能。
grep -F -v -f smallfile bigfile
我寫了一個python腳本生成一些測試數據:
bigfile = open('bigfile', 'w')
smallfile = open('smallfile', 'w')
count = 2000000
start = 1000000
for i in range(start, start + count):
bigfile.write('foo' + str(i) + 'bar\n')
if i % 2:
smallfile.write(str(i) + '\n')
bigfile.close()
smallfile.close()
這裏有一些測試中,我只使用2000線(集數到2000年),因爲多線所需的時間跑就跑沒有-F
的grep變得可笑了。
$ time grep -v -f smallfile bigfile > /dev/null
real 0m3.075s
user 0m2.996s
sys 0m0.028s
$ time grep -F -v -f smallfile bigfile > /dev/null
real 0m0.011s
user 0m0.000s
sys 0m0.012s
grep的也有--mmap
開關可能根據手冊頁來提高性能。在我的測試中,沒有性能提升。
對於這些測試中,我用了2萬線。
$ time grep -F -v -f smallfile bigfile > /dev/null
real 0m3.900s
user 0m3.736s
sys 0m0.104s
$ time grep -F --mmap -v -f smallfile bigfile > /dev/null
real 0m3.911s
user 0m3.728s
sys 0m0.128s
它是一個常數位數? – FakeRainBrigand
所以較小的文件沒有文件名,只是包含在較大文件中存在的文件名中的數字? – lurker