2016-04-03 10 views
0

FSのu_test文字列の隣のフィールドにFSを,とし、システムコマンドに#で始まらない行を入れたいとします。これは私の場合はgrepです。その文字列はtop.vファイルにあります。awkコマンドで取得したフィールドをgrepに使用

BEGIN{FS=","} 

{ 
    if($0 !~ /^#/){ 
     for(i=1;i<=NF;i++){ 
      if($i ~ /u_test/){ 
       a=$(i+1); 
       cmd = "grep '\$(i+1)' top.v"; 
       printf("%s\n",a); 
       system(cmd); 
      } 
     } 
    } 
} 

上記のコードは機能していないようです。

+0

あなたは例の入力だけでなく、あなたが(すなわち、達成しようとする内容の説明を与えることができます出力例)? – Derlin

+0

このスクリプトへの入力には、u_test、abcd、pqrs、wyxcというレコードが含まれているとします.u_testフィールドの隣にある 'abcd'を抽出し、この文字列を別のファイルtop.v –

+1

に表示する必要があります。正確な*入力と*正確な*期待される出力。あなたの質問を編集してこれらの詳細を更新してください。 – tripleee

答えて

0

問題は、cmd文字列を構成する方法に起因します。実際:

cmd = "grep '\$(i+1)' top.v"; 
print cmd; 

は、したがって\$はプレーン$として扱われ、awkの変数で置き換えられることはありません、あなたにgrep '$(i+1)' top.vを与えます。

だから、代わりに、使用します。

cmd = "grep '"$(i+1)"' top.v"; 

または単に:

$0 !~ /^\#/ { # replaces the if 
    # your code with the for loop 
} 

:また

cmd = "grep '"a"' top.v"; 

が、私はあなたの代わりにifの本当のawkの条件を使用することをお勧め

それを楽しむために、彼女eは同じことをやってsedxargsを使用してワンライナーです:

cat ex.txt | sed 's/^#.*//' | sed -n 's/.*u_test,\([^,]*\).*$/\1/p' | xargs -I{} grep {} top.v 
関連する問題