2016-07-29 13 views
0

内の正規表現:バッシュ:私はこのようになります「align_summary.txt」と呼ばれるファイル持っているバッククォート

Left reads: 


Input  : 26410324 

    Mapped : 21366875 (80.9% of input) 

    of these: 451504 (2.1%) have multiple alignments (4372 have >20) 

...more text.... 

... and several more lines of text.... 

は、私は複数のアライメントの%を引き出したいすべての左側の間で整列を読み込む(この場合、それはbashシェルの2.1)です。

私が使用している場合は、この:私はこのようなバッククォートで同じ式を囲む場合は、しかし、2.1

leftmultiple=`pcregrep -M "Left reads.\n..+.\n.\s+Mapped.+.\n.\s+of these" align_summary.txt | awk -F"\\\(" '{print $2}' | awk -F"%" '{print $1}' | sed -n 4p` 

私が受け取るそれは速やかに私に出力を与える

pcregrep -M "Left reads.\n..+.\n.\s+Mapped.+.\n.\s+of these" align_summary.txt | awk -F"\\\(" '{print $2}' | awk -F"%" '{print $1}' | sed -n 4p 

エラー:

awk: syntax error in regular expression ( at 
    input record number 1, file 
    source line number 1 

私が理解しているように、この式をバッククォートで囲むことは、バックスラッシュでエスケープされているにもかかわらず、 "("記号を含む正規表現の解釈に影響します。

なぜこのエラーが発生し、このエラーを回避するのですか?

ご意見やご提案に感謝します。

多くのおかげで、

答えて

0

だけawkを使用します。

leftmultiple=$(awk '/these:.*multiple/{sub(" ","",$2);print $2}' FS='[(%]' align_summary.txt) 
0

は常にただ一人のawk使用し、より重要なの$(...)の代わりにバッククォートを使用しますが:

$ leftmultiple=$(gawk -v RS='^$' 'match($0,/Left reads.\s*\n\s+.+\n\s+Mapped.+.\n.\s+of these[^(]+[(]\s*([^)%]+)/,a) { print a[1] }' align_summary.txt) 
$ echo "$leftmultiple" 
2.1 

上記は、GNU AWK 4を使用しています。*あなたの入力ファイルの他の場所での誤った一致を避けるために使用していた複雑な正規表現が必要であると仮定します。それが当てはまらない場合、スクリプトはもちろんもっと簡単になります。

関連する問題