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) の中で、複数の配置の割合を引き出したいと考えています。

私がこれを使用する場合:

 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

すぐに出力が得られます: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`

エラーが表示されます:

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

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

これが発生する理由と、このエラーを回避する方法を教えてください。

ご意見やご提案をいただければ幸いです。

どうもありがとう、

4

2 に答える 2

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.* を使用しており、入力ファイルの他の場所で誤った一致を回避するために使用していた複雑な正規表現が必要であると想定しています。そうでない場合は、もちろん、スクリプトははるかに単純になります。

于 2016-07-29T18:01:41.767 に答える
0

使用するだけawkです:

leftmultiple=$(awk '/these:.*multiple/{sub(" ","",$2);print $2}' FS='[(%]' align_summary.txt )
于 2016-07-29T17:55:27.883 に答える