file1 で文字列を検索し、file2 で発生回数を計算します。

file1 で文字列を検索し、file2 で発生回数を計算します。

私はfile1.txt次のような文字列値を持っています。

New Drug Application
Drug Product
Dosing instructions

この文字列がdataでどのくらいの頻度で表示されるかを計算する必要がありますfile2.txt

Regulatory New Drug Application for Drug Product after testing of Dosing instructions for all new studies.

私が使用したコマンドは次のとおりです。

foreach string ( `cat terms.txt` )
foreach? echo $string >>out.txt
foreach? grep $string data.txt | wc >>out.txt
end

out.txtスペースを含む完全な文字列は返されません。代わりに、次のデータを返します。

The -1
New -2
Application -1
etc.

データファイルの用語に引用符とスラッシュを追加してみましたが、役に立ちませんでしたegrepfgrepこれら2つのファイルから目的のデータをどのように取得できますか?

答え1

この試み:

fgrep -of file1.txt file2.txt | sort | uniq -c

これにより、正確なフレーズのみが検索されます。間隔が異なると見つかりません。

答え2

多分内部フィールド区切り記号(IFS)を使用し、ここに$ '\ n'を割り当てることができます。これは改行だけが有効な区切り文字であることを意味します。また、コンテンツで同じキーが複数回発生することを検出するには、grep -oオプションを使用できます。サンプルbashスクリプトは次のとおりです。

IFS=$'\n'
for string in `cat key.txt`
do
   $string >> out.txt
   grep -o $string content.txt | wc -l >> out.txt
done

答え3

ライン全体をgrepする必要があります。これは次のように行うことができます -

    x=1
    len=$(wc -l file1.txt | awk '{print $1}')
    while [ $x -le $len ] 
    do
       #pat=$(head -$x  file1.txt | tail -1)  << slow hence changed
       pat=$(sed "${x}q;d" $1)
       #cnt=$(grep -c "$pat" file2.txt) < Edited to count all matches 
       cnt=$(grep -o "$pat" file2.txt| wc -l | awk '{print $1}')
       echo "$pat        $cnt"
       x=$(expr $x + 1)
    done

編集:速度を上げ、同じ行で複数回発生する回数を数えます。

関連情報