我有一個單詞串列,我需要檢查一百多個文本檔案。
我的單詞檔案串列名為:word2search.txt。
此文本檔案包含 N 個單詞:
Word1
Word2
Word3
Word4
Word5
Word6
Wordn
到目前為止,我已經完成了這個 bash 檔案:
#!/bin/bash
listOfWord2Find=/home/mobaxterm/MyDocuments/word2search.txt
while IFS= read -r listOfWord2Find
do
echo "$listOfWord2Find"
grep -l -R "$listOfWord2Find" /home/mobaxterm/MyDocuments/txt/*.txt
echo "================================================================="
done <"$listOfWord2Find"
結果令我不滿意,我幾乎無法利用結果
Word1
/home/mobaxterm/MyDocuments/txt/new 6.txt
/home/mobaxterm/MyDocuments/txt/file1.txt
/home/mobaxterm/MyDocuments/txt/file2.txt
/home/mobaxterm/MyDocuments/txt/file3.txt
=================================================================
Word2
/home/mobaxterm/MyDocuments/txt/new 6.txt
/home/mobaxterm/MyDocuments/txt/file1.txt
=================================================================
Word3
/home/mobaxterm/MyDocuments/txt/new 6.txt
/home/mobaxterm/MyDocuments/txt/file4.txt
/home/mobaxterm/MyDocuments/txt/file5.txt
/home/mobaxterm/MyDocuments/txt/file1.txt
=================================================================
Word4
/home/mobaxterm/MyDocuments/txt/new 6.txt
/home/mobaxterm/MyDocuments/txt/file1.txt
=================================================================
Word5
/home/mobaxterm/MyDocuments/txt/new 6.txt
=================================================================
這是我想看到的:
/home/mobaxterm/MyDocuments/txt/file1.txt : Word1, Word2, Word3, Word4
/home/mobaxterm/MyDocuments/txt/file2.txt : Word1
/home/mobaxterm/MyDocuments/txt/file3.txt : Word1
/home/mobaxterm/MyDocuments/txt/file4.txt : Word3
/home/mobaxterm/MyDocuments/txt/file5.txt : Word3
/home/mobaxterm/MyDocuments/txt/new 6.txt : Word1, Word2, Word3, Word4, Word5, Word6
我不明白為什么我的腳本沒有顯示 Word6(有些檔案包含這個 word6)。它停在第 5 字。為了避免這個問題,我添加了一個新行 blablabla (我肯定不會發現這種情況)。
如果你能在這個問題上幫助我:) 謝謝。
uj5u.com熱心網友回復:
另一種更優雅的方法來搜索每個檔案上的所有單詞。一次一個檔案。
使用grep命令多模式選項-f, --file=FILE,并列印匹配的行-o, --only-matching
然后將生成的單詞通過管道按摩到csv串列中。
像這樣:
腳本.sh
#!/bin/bash
for currFile in $*; do
matched_words_list=$(grep --only-matching --file=$WORDS_LIST $currFile |sort|uniq|awk -vORS=', ' 1|sed "s/, $//")
printf "%s : %s\n" "$currFile" "$matched_words_list"
done
script.sh 輸出
在環境變數中傳遞單詞串列檔案:WORDS_LIST
將檢查的檔案串列作為引數串列傳遞input.*.txt
export WORDS_LIST=./words.txt; ./script.sh input.*.txt
input.1.txt : word1, word2
input.2.txt : word4
input.3.txt :
解釋:
使用words.txt:
word2
word1
word5
word4
使用 input.1.txt:
word1
word2
word3
word3
word1
word3
和管道按摩grep命令
grep --file=words.txt -o input.1.txt |sort|uniq|awk -vORS=, 1|sed s/,$//
word1,word2
輸出 1
列出檢查檔案 input.1.txt 中 words.txt 中的所有匹配詞
grep --file=words.txt -o input.1.txt
word1
word2
word1
輸出 2
列出檢查檔案 input.1.txt 中 words.txt 中的所有匹配詞
比對輸出單詞串列進行排序
grep --file=words.txt -o input.1.txt|sort
word1
word1
word2
輸出 3
列出檢查檔案 input.1.txt 中 words.txt 中的所有匹配詞
比對輸出單詞串列進行排序
比洗掉重復的單詞
grep --file=words.txt -o input.1.txt|sort|uniq
word1
word2
輸出 4
列出檢查檔案 input.1.txt 中 words.txt 中的所有匹配詞
比對輸出單詞串列進行排序
比洗掉重復的單詞
csv比從獨特的單詞創建一個串列
grep --file=words.txt -o input.1.txt|sort|uniq|awk -vORS=, 1
word1,word2,
輸出 5
列出檢查檔案 input.1.txt 中 words.txt 中的所有匹配詞
比對輸出單詞串列進行排序
比洗掉重復的單詞
csv比從獨特的單詞創建一個串列
,比從csv串列中洗掉尾隨
grep --file=words.txt -o input.1.txt|sort|uniq|awk -vORS=, 1|sed s/,$//
word1,word2
uj5u.com熱心網友回復:
建議的策略是用所有單詞掃描每一行一次。
建議寫 gawk腳本,這是標準的Linuxawk
腳本.awk
FNR == NR { # Only in first file having match words list
matchWordsArr[ wordsCount] = $0; # read match words into ordered array
matchedWordInFile[wordsCount] = 0; # reset matchedWordInFile array
}
FNR != NR { # Read line in inspected file
for (i in matchWordsArr) { # scan line for all match words
if ($0 ~ matchWordsArr[i]) matchedWordInFile[i] ; # if word is mached increment respective matchedWordInFile[i]
}
}
ENDFILE{ # on each file read completion
if (FNR != NR) { # if not first file
outputLine = sprintf("%s: ", FILENAME); # assign outputLine header to current fileName
for (i in matchWordsArr) { # iterate over matched words
if (matchedWordInFile[i] == 0) continue; # skip unmatched words
outputLine = sprintf("%s%s%s", outputLine, seprator, matchWordsArr[i]); # append matched word to outputLine
matchedWordInFile[i] = 0; # reset matched words array
seprator = ","; # set words list seperator ","
}
print outputLine;
}
outputLine = seprator = ""; # reset words list seperator "" and outputLine
}
輸入.1.txt:
word1
word2
word3
輸入.2.txt:
word3
word4
word5
輸入.3.txt:
word3
word7
word8
單詞.txt
word2
word1
word5
word4
跑步:
$ awk -f script.awk words.txt input.*.txt
input.1.txt: word2,word1
input.2.txt: word5,word4
input.3.txt:
uj5u.com熱心網友回復:
只需 grep:
grep -f list.txt input.*.txt
-f FILENAME允許使用帶有模式的檔案進行 grep 搜索。
如果要顯示匹配的檔案名,-H除此之外還傳遞:
grep -Hf list.txt input.*.txt
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/426449.html
上一篇:如何與awk進行嚴格匹配
