Конфликт внутреннего столбца gnuplot конфликтует с аргументами скрипта контейнера bash - PullRequest
1 голос
/ 20 апреля 2020

У меня есть следующий код в скрипте bash, который подготавливает входные данные к построению.

Код выполняется нормально при запуске в интерпретаторе gnuplot, но в скрипте bash он заменяет $ 2, который предназначен для представления столбцов 2 файла данных $ {outdir} /counts.txt вторыми bash аргументами (входной файл больше не имеет ничего общего с графиком)

Как я могу отредактировать это так, чтобы $ 1 и $ 2 остаются частными для блока gnuplot?

  #!/bin/bash

  .. bash code

  gnuplot <<-EOFMarker
    set datafile separator ","
    set key autotitle columnhead
    set style line 1 \
        linecolor rgb '#0060ad' \
        linetype 1 linewidth 2 \
        pointtype 7 pointsize 1.5
    set yrange [*:100]
    set xlabel "mappability %"
    set ylabel "% above threshold"
    max(a,b)=a>b?a:b
    a=-99999999.
    set terminal pngcairo
    set output 'mappability_plot.png'
    plot '${outdir}/counts.txt' using 1:(a=max(a,$2),0/0) notitle, \
        '' using 1:(100*$2/a) notitle with linespoints linestyle 1
    EOFMarker

Ответы [ 2 ]

2 голосов
/ 20 апреля 2020

Вместо $1 и $2, попробуйте column(1) и column(2) ...

0 голосов
/ 21 апреля 2020

Вы можете не допустить расширения оболочки $something в данном документе, экранируя символ $ с помощью обратной косой черты sh:

gnuplot <<-EOFMarker
    [...]
    plot '${outdir}/counts.txt' using 1:(a=max(a,\$2),0/0) notitle, \
        '' using 1:(100*\$2/a) notitle with linespoints linestyle 1
    EOFMarker

Обратите внимание, что ${outdir} не экранируется, поэтому оболочка будет go впереди и заменяет ее как обычно. Кстати, вам также понадобится экранировать символы обратной косой черты или backsla sh (escape), которые вы хотите передать программе, без интерпретации.

Кстати, здесь это не применимо, но вы можете включить отключите все подстановки в данном документе, заключив в кавычки разделитель:

gnuplot <<-'EOFMarker'
    $things `that` $won't \be $expanded
EOFMarker

Причина, по которой это не сработает, заключается в том, что он не позволит оболочке расширяться ${outdir} как хорошо, и я предполагаю, что это не то, что вы хотите.

...