2017-10-03 10 views
-2

私はawkを使ってファイルから行を取得する単純なbashループを書いています。パターンはループ内で反復されます。私はawkの中で使用される変数に記号を追加しようとするまで、私は、WORKING PROGRAMに(最初の用語を検索し、「猫」である)シンボルと連結されたawk変数

検索パターンのためのプログラムが正常に動作する

list="cat dog" 

for k in $list 
do 
vark="$k" 
awk '/'$vark'/{print RS $0}' RS=\> FILE1 > FILE2 
done 

しかし、私は試すを得ることができます記号 "|"を追加する、 "<"、および "_"をループが壊れる変数に追加します。私はシンボルのために複数のセパレータを試しましたが、シンボルを変数に正しく組み込むことができませんでした。

BROKEN PROGRAM(最初の検索語である "|猫> _")

list="cat dog" 

for k in $list 
do 
vark="$k" 
varkk="|$k>_" 
awk '/'$varkk'/{print RS $0}' RS=\> FILE1 > FILE2 
done 

はあなたの助けのためにありがとうございました!

+0

を使用して|が' awkの正規表現で特殊文字なので、あなたがそれをエスケープする必要があります。 –

答えて

0

awk '/'$varkk'/{print RS $0}' RS=\> FILE1 > FILE2 

から-v varname="$shell_var"

のように、-vオプションを使用しているawkにシェル/ bashの変数を渡す

正しい方法あなたも行うことができます

awk -v regexp="$vark" -v RS='\>' '$0 ~ regexp{print RS $0}' FILE1 > FILE2 

へこの、 `ことを注意awk自体

awk ' 
     FNR==NR{ arr[$0]; next } 
     { for(i in arr)if($0 ~ i){ print RS $0; next} } 
    ' pattern_file RS='\>' FILE1 >file2 
+0

ありがとうございました!ちょうど私が正しく理解していることを確認するために、正規表現を使用している例では、 "|"と "_"が指定されていますか? vark = "| $ k> _"これが明らかであれば残念ですが、awkにはまだまだ残念です。ありがとう! :) – pallascat1492

+0

@ pallascat1492: '-v regexp'は単なる変数名です。シェル/ bash変数をawkに渡す方法です –

関連する問題