Получить номер строки, где появляется первое вхождение значения? - PullRequest
1 голос
/ 23 апреля 2020

У меня есть CSV-файл, как показано ниже:

E   Run 1   Run 2   Run 3   Run 4   Run 5   Run 6   Mean
1   0.7019  0.6734  0.6599  0.6511  0.701   0.6977  0.680833333
2   0.6421  0.6478  0.6095  0.608   0.6525  0.6285  0.6314
3   0.6039  0.6096  0.563   0.5539  0.6218  0.5716  0.5873
4   0.5564  0.5545  0.5138  0.4962  0.5781  0.5154  0.535733333
5   0.5056  0.4972  0.4704  0.4488  0.5245  0.4694  0.485983333

Я пытаюсь найти номер строки, где последний столбец имеет значение ниже определенного диапазона. Например, ниже 0.6.

Используя вышеуказанный CSV-файл, я хочу вернуть 3, поскольку E = 3 - это первая строка, где Mean <= 0.60. Если нет значения ниже 0.6, я хочу вернуть 0. По сути, я возвращаю значение в первом столбце на основе последнего столбца.

Я планирую инициализировать это число как константу в gnuplot. Как это может быть сделано? Я пометил awk, потому что я думаю, что это связано.

Ответы [ 3 ]

4 голосов
/ 24 апреля 2020

Если вам нужна версия только для gnuplot ... если вы используете файл, удалите блок данных и замените $Data именем файла в "".

reset session

$Data <<EOD
E   Run 1   Run 2   Run 3   Run 4   Run 5   Run 6   Mean
1   0.7019  0.6734  0.6599  0.6511  0.701   0.6977  0.680833333
2   0.6421  0.6478  0.6095  0.608   0.6525  0.6285  0.6314
3   0.6039  0.6096  0.563   0.5539  0.6218  0.5716  0.5873
4   0.5564  0.5545  0.5138  0.4962  0.5781  0.5154  0.535733333
5   0.5056  0.4972  0.4704  0.4488  0.5245  0.4694  0.485983333
EOD

set table $Dummy
    plot E=flag=0 $Data u ($8<=0.6 && flag==0 ? (E=$1, flag=1) : 0) w table
unset table

print E

Результат:

3.0
3 голосов
/ 24 апреля 2020

Еще один awk. Вы можете инициализировать возвращаемое значение по умолчанию как var ret в BEGIN, но, поскольку оно равно 0, в действительности нет никакой точки, поскольку пустое var+0 производит тот же эффект. Если пороговое значение 0,6 не достигнуто до достижения значения END, оно возвращается. Если оно выполнено, exit вызывает END и ret выводится:

$ awk '
NR>1 && $NF<0.6 {    # final column has a value below a certain range
    ret=$1           # I want to return 3 because E = 3
    exit
}
END {
    print ret+0
}' file

Выход:

3
3 голосов
/ 23 апреля 2020

Примерно так должно получиться:

awk 'NR>1 && $8<.6 {print $1;fnd=1;exit}END{if(!fnd){print 0}}' yourfile
...