Отдых Grep строки … после соответствия

В vim, использовать

/\(^\|\s\)-c\($\|\s\)

В less:

/(^|\s)-c($|\s\)

Вы могли использовать isk и границы слова в энергии, но это также соответствовало бы другим вещам, которые могли бы быть опциями; более безопасно явно искать пробелы.

8
18.06.2014, 00:50
8 ответов

Все значения:

$ awk -F '[ -]*' '$0=$NF' /tmp/pwpower.log
114.10
130.09

Значение в первой строке:

$ awk -F '[ -]*' 'NR==1{print $NF;exit}' /tmp/pwpower.log
114.10

Значение во второй строке:

$ awk -F '[ -]*' 'NR==2{print $NF;exit}' /tmp/pwpower.log
130.09

Сумма всех значений:

$ awk -F '[ -]*' '{sum+=$NF} END{print sum}' /tmp/pwpower.log
244.19
12
27.01.2020, 20:08

Вы можете использовать cut для выбора 2-го столбца чисел и вставить -sd+ для создания серии чисел для сложения. Затем можно использовать инструмент bc для выполнения вычисления.

$ cut -d',' -f2 pwpower.log | paste -sd+ | bc
-244.19

Как он работает

Выбирает числа из 2-го столбца.

$ cut -d',' -f2 pwpower.log 
 -114.10
 -130.09

Переформатирует их в одну строку со знаком + между каждым числом:

$ cut -d',' -f2 pwpower.log | paste -sd+
 -114.10+ -130.09

Выполняет вычисление:

$ cut -d',' -f2 pwpower.log | paste -sd+ | bc
-244.19

Для получения абсолютного значения:

$ cut -d',' -f2 pwpower.log | sed 's/-//g' | paste -sd+ | bc
244.19

Если формат файла pwpower. log гарантированно можно попросить cut сделать опускание знака минус:

$ cut -d'-' -f2 pwpower.log | paste -sd+ | bc
244.19
8
27.01.2020, 20:08

Подход KISS

$ awk '{print -$2; t+=-$2}; END{print t}' pwpower.log 
114.1
130.09
244.19
6
27.01.2020, 20:08
[root@ip-10-186-149-181 ~]# cut -d '-' -f2 /tmp/pwpower.log | paste -sd+ | bc
244.19

Это сделает вычисление без минуса.

Я думаю, что сокращение быстрее, чем awk, в общем

.
3
27.01.2020, 20:08

awk является правильным инструментом, но число, вероятно, может быть положительным (верно?), что означает, что вы делаете , а не хотите использовать знак минуса в качестве разделителя полей. Вместо этого используйте запятую в качестве разделителя полей, затем отрицайте каждое значение численно -- awk автоматически преобразует строки в числа для вас:

$ awk -F, '{ print -$2 }' < /tmp/pwpower.log
114.1
130.09

Если окажется, что есть какие-либо положительные числа, то они выйдут отрицательными. Если вам нужна только сумма, awk тоже может это сделать:

$ awk -F, '{ sum += -$2 } END { print sum }' < /tmp/pwpower.log
244.19
1
27.01.2020, 20:08

Суммировать два значения:

(awk -F- '{printf "%s+", $2}' /tmp/pwpower.log; echo 0) | bc -l
0
27.01.2020, 20:08

Вы можете использовать sed также

$-sed -r 's/[^-]+.(.*)/\1/g' /tmp/pwpower.log
0
27.01.2020, 20:08

Мне нравится ваша команда grep, но она может быть улучшена, чтобы удалить знак минус, и работать в случаях, когда нет знака минус. Расширенные регулярные выражения, доступные в GNU grep с флагом -E, позволяют нам более точно сопоставлять число.

Немного эффективнее не использовать cat, а передать имя файла в качестве аргумента первой команде и позволить ему прочитать файл. Также мне кажется, что если вы имеете дело только с первой или последней строкой из файла, то имеет смысл сначала использовать команды head или tail, так что вам нужно будет сопоставить только одну строку с grep.

Первое значение:

$ head -n 1 /tmp/pwpower.log | grep -oE '[0-9\.]+$' 
114.10

Последнее значение:

$ tail -n 1 /tmp/pwpower.log | grep -oE '[0-9\.]+$'
130.09

Сумма (командой awk из здесь):

$ grep -oE '[0-9\.]+$' /tmp/pwpower.log | awk '{s+=$1} END {print s}'
244.19
4
27.01.2020, 20:08

Теги

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