Как вывести данные из файла из определенных строк, начинаются со специальной строки - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь выполнить команду, аналогичную

plot "data.asc" every ::Q::Q+1500 using 2 with lines 

Но у меня проблема с этим номером "Q". Это не общеизвестное значение, но номер строки с определенной строкой. Допустим, у меня есть строка со строкой «SET_10:», а затем у меня есть данные для построения после этой конкретной линии. Есть ли способ, как определить номер этой строки с конкретной строкой?

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Вот версия полностью в gnuplot, без каких-либо внешних команд. Я проверил это на gnuplot 5.0 patchlevel 3, используя следующие bash команды, чтобы создать простой набор данных из 20 строк, из которых только 5 строк должны быть напечатаны из строки с «началом» в столбце 1. Вам не нужно этого делать .

for i in $(seq 1 20)
do   let j=i%2
     echo "$i $j" 
done >data.asc
sed -i data.asc -e '5a\
start'

Фактический gnuplot использует переменную endlno, изначально установленную на NaN (не число), и функцию f, которая принимает 3 параметра: логическое значение start, говорящее, что в столбце 1 есть соответствующая строка, lno текущий номер белья и текущее значение столбца 1 val. Если номер белья меньше или равен номеру конечной строки (и, следовательно, он не равен NaN), f возвращает val, в противном случае, если условие начала истинно, требуемый номер конечной строки устанавливается в переменная endlno и NaN возвращается. Если мы еще не видели начало, NaN возвращается.

gnuplot -persist <<\!
endlno=NaN
f(start,lno,val) = ((lno<=endlno)?val:(start? (endlno=lno+5,NaN) : NaN))
plot "data.asc" using (f(stringcolumn(1)eq "start", $0, $1)):2 with lines 
!

Поскольку gnuplot не отображает точки со значениями NaN, мы игнорируем линии до начала и снова после требуемого количества линий. В вашем случае вам нужно изменить 5 на 1500 и «начать» на «SET_10:».

0 голосов
/ 29 августа 2018

Простой способ - передать данные через GNU sed, чтобы вывести только нужные строки:

plot "< sed -n <data.asc '/^SET_10:/,+1500{/^SET_10:/d;p}'" using 1:2 with lines 

-n останавливает любой вывод, a, b говорит, между какими строками выполнять команды {...}, и эти команды говорят об удалении строки триггера, а p печатают остальные .


Чтобы убедиться, что у вас есть совместимый GNU sed, попробуйте команду самостоятельно, для короткого числа строк, например 5:

sed -n <data.asc '/^SET_10:/,+5{/^SET_10:/d;p}'

Если это не выводит первые 5 строк ваших данных, альтернативой является использование awk, поскольку в sed слишком сложно считать строки без этого специфичного для GNU синтаксиса. Протестируйте (стандартный POSIX, не специфичный для GNU) эквивалент awk:

awk <data.asc 'end!=0 && NR<=end{print} /^start/{end=NR+5}'

и если это нормально, используйте его в gnuplot как

plot "< awk <data.asc 'end!=0 && NR<=end{print} /^start/{end=NR+1500}'" using 1:2 with lines
...