2011-01-14 15 views
0

私はDebian/GNU Linux OSで作業していて、短いシェルコマンド(端末またはexternスクリプト)を使いたいと思っています。grep:各行の1つ以上の単語のリストをテキストファイルと比較する

私の目的:私は

---- foo.txtの----

dog 
cat 
mouse with hat 

----¥foo.txtというようfoo.txtの中で単語のリストを持っています - -

このリストとbar.txt(通常のテキストにいくつかの段落を含める)を比較したい。私は試合の2種類がしたい

:各ラインのすべての単語(例えば「帽子を持つマウスを」だけでなく、単に「帽子」)と一致する必要があり

  1. 各ライン全体の唯一の最初の外観は、最初の問題に関連

と一致する必要があります:

私の最初のコード(これまでのコマンドライン用)と私の問題:

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 

あなたの2番目の質問に、あなたは少し空想を取得する必要があります。まず、一致した各文字列とともに行番号を出力し、一致した文字列を一意にして各文字列に一致する行番号を取得します。

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) 
関連する問題