2011-01-14 59 views
0

我正在使用Debian/GNU Linux OS並且喜歡使用短shell命令(終端或extern腳本)。grep:將每行中一個或多個單詞的列表與文本文件進行比較

我的目標:我有一個像

在foo.txt的單詞列表---- ---- foo.txt的

dog 
cat 
mouse with hat 

---- /foo.txt - -

並希望將此列表與bar.txt進行比較(意味着包含一些段落的普通文本)。

我想有兩種比賽:

  1. 每一行的所有單詞應該匹配(例如,「帽子鼠標」以及剛剛「帽子」)

  2. 只有每條整行的首次出現應該匹配

第一個問題相關:

我的第一個代碼(到目前爲止的命令行),我的問題:

for i in foo.txt; do fgrep -f foo.txt bar.txt 

只是匹配列表的第一個字。 現在,我想我有使用類似

for i in foo.txt; do fgrep -e <some-kind-of-regexp> -f foo.txt bar.txt 

但我陷入了與正則表達式:(

涉及到的第二個問題 對於停止的grep我只知道-m選項。先用任何比賽後

for i in foo.txt; do fgrep -m 1 -f foo.txt bar.txt 

停止。但我喜歡有像「搜索任何的第一場比賽和瀏覽整個列表後停止」。

回答

1

對於您的第一個問題,您需要在將它列入grep之前將列表拆分爲單個單詞。我爲此使用了awk,但您也可以使用sed。我對分裂空白,但你可以很容易地在非字母數字拆分如果這就是你想要的東西:

fgrep -f <(mawk 'BEGIN{FS=" "}{print; if(NF > 1)for(i=1; i<=NF; i++)print $i}' foo.txt) bar.txt 

你的第二個問題,你需要獲得一點點花哨。首先,輸出行號以及每個匹配的字符串,然後您可以在匹配的字符串上唯一地獲取與每個字符串匹配的行號。

cat bar.txt \ 
| mawk '{print NR,$0}' \ 
| join -1 1 -2 1 - <(fgrep -o -n -f <(mawk 'BEGIN{FS=" "}{print; if(NF > 1)for(i=1; i<=NF; i++)print $i}' foo.txt) bar.txt \ 
| sort -k2,2 -k1,1n \ 
| sort -k2,2 -us \ 
| cut -f1 \ 
| sort -k1,1) 
相關問題