我有一個包含 3,961,179 行的 WMT17 訓練資料集。
從這些行中,我想增加 198,058 個隨機行,例如通過在包含單詞“move”的每一行的末尾插入一個\tbewegen(\t是一個制表符)。
“move”這個詞可以在句子中的任何位置,它是句子的子串,例如
1. There was more behind this move than simply wishing to expand their product portfolio .
2. move and collect miles
3. January 16 - Pro@@ hi@@ bition begins in USA . Many li@@ qu@@ or @-@ lo@@ ving Americans move to France .
.
.
.
如果子串“move”出現在一行中,那么句子應該是這樣的
1. There was more behind this move than simply wishing to expand their product portfolio .\tbewegen
2. move and collect miles\tbewegen
3. January 16 - Pro@@ hi@@ bition begins in USA . Many li@@ qu@@ or @-@ lo@@ ving Americans move to France .\tbewegen
.
.
.
為此,我已經撰寫了一個腳本,但我發現增加 10 行大約需要 2 分鐘,而增加 198,058 行需要 39,611 分鐘。
這是我的 bash 腳本:
sed -n '=' train.de | shuf | head -198058 > lines
cat lines | while IFS= read -r line ;
do
sed -i.bak "${line}s/move/$/\tbewegen/" train.de;
done
有沒有辦法縮短流程,讓我不必等待幾天?
更新:假設我想在https://www.golinuxhub.com/2017/06/sed-insert-word-after-match-in-middle/操作之前/之后應用插入。如何重寫解決方案中的awk代碼?
編輯:
您可以使用以下命令在匹配的單詞之前或之后隨機插入一個單詞:
awk -i inplace '(NR==FNR){a[$1];next}
(FNR in a) && gsub(/\<the\>/,"Before &")
1
' <(shuf -n 198058 -i 1-$(wc -l < n_train)) n_train
awk -i inplace '(NR==FNR){a[$1];next}
(FNR in a) && gsub(/\<the\>/,"& After")
1
' <(shuf -n 198058 -i 1-$(wc -l < n_train)) n_train
uj5u.com熱心網友回復:
以下命令應該可以幫助您。它讀取一系列亂數,然后處理檔案。這不會進行就地修改,而是將輸出列印到螢屏上。重定向將保存檔案。
awk '(NR==FNR){a[$1];next}
(FNR in a) && /\<move\>/ {$0=$0 "\tbewegen"}
1
' <(shuf -n 198058 -i 1-$(wc -l < train.de)) train.de
這包含幾個命令:
1.獲取隨機選擇的行號:
shuf -n 198058 -i 1-$(wc -l < train.de)
此行會在 1-N 范圍內隨機選擇 198058 個數字,其中 N 是檔案train.de中由 給出的總行數awk 'END{print NR}' train.de。此行替換代碼中的初始行:
sed -n '=' train.de | shuf | head -198058 > lines
2. 使用 awk 完成剩下的作業:
awk '(NR==FNR){a[$1];next}(FNR in a) && /\<move\>/{$0=$0 "\tbewegen"}1' file1 file2
我們在這里使用 awk 來讀取 file1 的輸入( 的輸出shuf)并將其全部存盤在一個a用作查找表的陣列中。讀取第一個檔案時,我們檢查第二個檔案的記錄號(行號),FNR并檢查查找表中是否有它a。如果這是真的,我們檢查該行是否包含單詞“move”。如果滿足這兩個條件,則通過添加\tbewegen來更新該行。
您現在可以將此輸出存盤在一個新檔案中。
這將比以前的版本快得多,因為它只讀取檔案兩次,在您的示例中,您讀取了 198059 次。
uj5u.com熱心網友回復:
這可能對您有用(GNU sed):
grep -n move file | shuf | head -198058 | sed 's/:.*/s#$#\\tbewegen#/' | sed -f - file
使用 grep 查找(帶有行號)所有包含move.
使用 shuf 隨機播放這些行。
取第一個 198058 行號。
使用 sed 從附加\tbewegen到檔案中標識的每一行的行號構建一個 sed 腳本。
使用該-f選項將 sed 腳本傳遞到另一個 sed 呼叫中,并針對原始檔案播放它。
如果 198508 行可能包含也可能不包含單詞move,請使用:
seq $(wc -l <file) | shuf | head -198058 | sed 's/$/s#$#\\tbewegen#/' sed -f - file
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/420557.html
標籤:
上一篇:會計學包含的兩種程式設計思想
下一篇:為nvim創建符號鏈接時出錯
