【问题标题】:Bash: regular expressions within backticksBash:反引号内的正则表达式
【发布时间】:2016-12-04 11:48:18
【问题描述】:

我有一个名为“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

据我了解,将此表达式括在反引号中会影响对包含“(”符号的正则表达式的解释,尽管它被反斜杠转义。

为什么会发生这种情况以及如何避免这个错误?

如有任何意见和建议,我将不胜感激。

非常感谢,

【问题讨论】:

    标签: regex linux awk backticks pcregrep


    【解决方案1】:

    只需使用awk:

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

    【讨论】:

      【解决方案2】:

      始终使用 $(...) 而不是反引号,但更重要的是,仅使用 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.* 并假设您确实需要使用复杂的正则表达式来避免输入文件中其他地方的错误匹配。如果不是这样,那么脚本当然可以变得更简单。

      【讨论】:

        猜你喜欢
        • 2010-09-18
        • 2022-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-13
        • 1970-01-01
        相关资源
        最近更新 更多