我有一個句子串列(每行一個句子)和一本字典(一個單詞串列,每行一個單詞)。我想使用 awk、grep 或 sed 來編輯句子檔案,以便只保留字典檔案中的單詞。例如字典:
hello
dog
lost
I
miss
computer
buy
輸入檔案:
I miss my dog
I want to buy a new computer
結果:
I miss dog
I buy computer
我知道這可以用 Python 輕松完成,但我嘗試使用終端命令(awk、sed、grep 或任何其他終端命令)。
謝謝你。
uj5u.com熱心網友回復:
在 Python 中,我只會讀取單詞串列檔案,創建一個包含單詞的字串串列,然后讀取輸入檔案并輸出該單詞(如果它存在于陣列中)。
這也是你的方式awk:
$ awk 'FNR == NR { dict[$0] = 1; next } # Read the dictionary file
{ # And for each word of each line of the sentence file
for (word = 1; word <= NF; word ) {
if ($word in dict) # See if it's in the dictionary
printf "%s ", $word
}
printf "\n"
}' dict.txt input.txt
I miss dog
I buy computer
(這確實會在每一行上留下一個尾隨空格,但如果重要的話很容易過濾掉)
uj5u.com熱心網友回復:
awk '
NR==FNR { dict[$1]; next }
{
sent = ""
for (i=1; i<=NF; i ) {
if ($i in dict) {
sent = (sent=="" ? "" : sent OFS) $i
}
}
print sent
}
' dict file
I miss dog
I buy computer
三元運算式(sent=="" ? "" : sent OFS)是為了確保我們不會在要輸出的句子的開頭或結尾處得到虛假的空白字符,如果前面已經有另一個單詞,則只在當前單詞之前添加一個空格。
以上假設匹配應區分大小寫。如果沒有,那么改dict[$1]到dict[tolower[$1]]和$i in dict到tolower($i) in dict。它還假設沒有標點符號需要考慮,例如I miss my dog.或my dog's friendly。如果那是錯誤的,則編輯您的問題以提供包含標點符號的示例輸入/輸出。
uj5u.com熱心網友回復:
這可能對你有用(GNU sed):
sed -E 'H;$!d;x;s/.//;y/\n/|/;s/.*/s#\\b(&)\\b#\\n\&#g/' dictionaryFile |
sed -Ef - -e 's/^(\S ).*/\1/mg;s/\n/ /g;s/.//' textFile
將其制作dictionaryFile成 sed 命令檔案,該檔案在該檔案中的每個單詞之前添加一個換行符。
在第二次呼叫 sed 時,使用從第一次呼叫通過管道傳輸的 sed 命令檔案,然后使用多行替換,洗掉一行中第一個單詞之后的所有內容。
用空格替換換行符并洗掉行首的第一個空格并列印結果。
可以通過添加/\S/!d到第二個 sed 呼叫命令來消除空行。
uj5u.com熱心網友回復:
這是作為偽代碼的基本演算法。我建議嘗試使用 AWK 來實作這個:
if (condition) statement [ else statement ]
while (condition) statement
do statement while (condition)
for (expr1; expr2; expr3) statement
for (var in array) statement
break
continue
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/317398.html
上一篇:在Linux上安裝PHP包
下一篇:根據部分文本洗掉重復行
