awk начать печать на основе условия

B— это первое поле $1в строке ввода. Просто начните обработку со 2-го поля:

awk 'NR==5{ for(i=2; i<=NF; i++) sum+=$i; print sum/(NF-1) }' file
4
05.02.2020, 00:57
4 ответа

Использованиеed:

$ printf '%s\n' '/^test/+2,$p' | ed -s file
1,2
3,3

В редакторе edкоманда /^test/+2,$pбудет печатать(p)строки, начиная с двух строк после строки, соответствующей ^test, до конца($).

Использованиеawk:

$ awk '/^test/ { flag = 1; count = 1 }; (flag == 1 && count <= 0); { count-- }' file
1,2
3,3

Здесь будет напечатана строка, если flagравно 1 и если countменьше или равно нулю. Флаг устанавливается в 1, когда шаблон ^testсопоставляется во входных данных, и тогда countтакже устанавливается на количество строк, которые необходимо пропустить до начала вывода (, не считая текущей строки ). countуменьшается для всех строк.

Немного другой подход сawk:

$ awk '/^test/ { getline; while (getline > 0) print }' file
1,2
3,3

Здесь мы сопоставляем наш шаблон, а затем сразу же читаем и отбрасываем следующую строку ввода. Затем мы используем цикл while для чтения остальной части файла, печатая каждую прочитанную строку.

Точно такой же подход, но сsed:

$ sed -n -e '/^test/ { n' -e ':again' -e 'n; p; b again' -e '}' file
1,2
3,3

Сопоставьте шаблон, затем прочитайте и отбросьте следующую строку (n), затем войдите в цикл чтения и печати каждой строки(n; p;). Цикл состоит из метки againи ветвления/перехода к этой метке (b again).

6
28.04.2021, 23:24

Если вы знаете, что ваши данные начинаются через 2 строки после testи в них больше нет строк с test, вы можете обойтись чем-то вроде этого:

awk '/^test$/ { f=1 } f && f++ > 2' filename

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

(
echo "set datafile separator ','"
echo "plot '-' using 1:2 with lines"
awk '/^test$/ { f=1 } f && f++ > 2' filename
echo "e"
) | gnuplot -persist

Plot of the data

2
28.04.2021, 23:24

Вы можете тривиально сделать это с диапазоном start, endс конечным условием, которое всегда ложно, и начальным условием, которое пропускает строки:

awk '/test/ && getline && getline, 0'
0
28.04.2021, 23:24
$ awk '/test/{n=NR} n && NR>n' file
1,2
3,3

$ awk '/test/{n=NR+1} n && NR>n' file
3,3

См. такжеhttps://stackoverflow.com/a/17914105/1745001

0
28.04.2021, 23:24

Теги

Похожие вопросы