2016-07-29 15 views
0

Ich habe eine Datei „align_summary.txt“, die wie folgt aussieht:Bash: Reguläre Ausdrücke Backticks

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.... 

ich das% des multiplen Alignments unter allen linksbündig ziehen will liest (in diesem Fall es ist 2.1) in der Bash-Shell.

Wenn ich dies:

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 

Es gibt mir sofort die Ausgabe: 2.1

Allerdings, wenn ich den gleichen Ausdruck in Backticks wie folgt einschließen:

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` 

I erhalten ein Fehler:

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

Wie ich es verstehe, beeinflusst die Einfügung dieses Ausdrucks in Backticks die Interpretation des regulären Ausdrucks, der "(" - Symbol enthält, trotz der Tatsache, dass es durch umgekehrte Schrägstriche zurückgehalten wird.

Warum passiert das und wie kann man diesen Fehler vermeiden?

Ich wäre dankbar für jeden Input und Anregungen.

Vielen Dank,

Antwort

0

Verwenden Sie einfach awk:

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

immer $(...) anstelle von Backticks aber noch wichtiger ist, benutzen Sie einfach awk allein:

$ 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 

Die oben verwendet GNU awk 4 . * und nimmt an, dass Sie die komplizierte Regexp benötigen, die Sie verwenden, um falsche Übereinstimmungen an anderer Stelle in Ihrer Eingabedatei zu vermeiden. Wenn das nicht der Fall ist, kann das Skript natürlich viel einfacher werden.