或者..一口氣,我們可以做這樣的事情。讓我們說,我們有一個500k行的數據文件。
$>
wc -l data.txt
500001 data.txt
$>
ls -lrtha data.txt
-rw-rw-r--. 1 gaurav gaurav 16M Oct 5 00:25 data.txt
$>
head -2 data.txt ; echo ; tail -2 data.txt
0|This is a test file maybe
1|This is a test file maybe
499999|This is a test file maybe
500000|This is a test file maybe
讓我們說,我們的users.txt有3-4個關鍵字,這是與「ab_」作爲前綴,在文件「data.txt中」
$>
cat users.txt
file
maybe
test
因此,我們要閱讀users.txt併爲每個單詞,我們想要將這個單詞改爲一個新單詞。例如,「文件」爲「ab_file」,「也許」爲「ab_maybe」。
我們可以運行一個while循環,讀取要逐個添加前綴的輸入單詞,然後運行perl命令將輸入字存儲在變量中的文件上。在下面的例子中,讀取字作爲$ word傳遞給perl命令。
我定時執行此任務,並且發生得相當快。是否在我的Windows 10上託管的VM上(使用Centos7)。
time cat users.txt |while read word; do perl -pi -e "s/${word}/ab_${word}/g" data.txt; done
real 0m1.973s
user 0m1.846s
sys 0m0.127s
$>
head -2 data.txt ; echo ; tail -2 data.txt
0|This is a ab_test ab_file ab_maybe
1|This is a ab_test ab_file ab_maybe
499999|This is a ab_test ab_file ab_maybe
500000|This is a ab_test ab_file ab_maybe
在上面的代碼中,我們讀到了一句話:測試,文件,也許在data.txt文件改成了ab_test,ab_file,ab_maybe。頭部和尾部計數確認我們的操作。
歡呼聲, 拉夫
感謝您快速回答本傑明:)。我已經嘗試過這種方法,但仍需要將近1分鐘的時間才能完成用戶的1000個條目.txt – user3150037
@ user3150037我不認爲用sed可以獲得更快的速度 - 它仍然必須經歷所有data.txt '並嘗試所有的替代品。更快的方法是找到一個描述'users.txt'中所有單詞的模式,然後你可以只用一個替換。儘管如此,我們不得不爲「users.txt」查看更多的實際數據。 –
users.txt是真實的數據,但有很多條目和data.txt也有類似的數據,但用戶範圍非常高(約500K)。 – user3150037