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 shell 中提取所有左对齐读取(在本例中为 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=$(awk '/these:.*multiple/{sub(" ","",$2);print $2}' FS='[(%]' align_summary.txt )
于 2016-07-29T17:55:27.883 回答
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 回答