У меня есть этот файл:
Month,CPU,RAM
July 2018,19%,46%
August 2018,20%,45%
September 2018,20%,41%
October 2018,21%,39%
November 2018,21%,39%
December 2018,21%,41%
January 2019,25%,46%
February 2019,27%,50%
Мне нужно вычислить разницу между значениями во втором столбце, но два на два:
Например :
July -> August
CPU : +1% ( because 20-19)
August -> September
CPU : +0% ( because 20-20)
September -> October
CPU : +1% ( because 21-20)
Я пробую это с июля и августа:
cat myfile.txt | egrep "July|August" | awk -F',' '{diff-=$2} END {print diff}'
Но результат таков:
39
И проблема в том, что я должен указать июль и август, что неэффективно, потому что я должен сделать это и для других месяцев.
Есть ли способ вычислить разницу между этими значениями? Мне просто нужно знать разницу между значениями (значение 2 - значение 1, значение 3 - значение 2 - значение 2 - значение 4 - значение 3 и т. д.), не обязательно иметь такое же представление, как в моем примере.
Пожалуйста, вы можете показать мне?
Спасибо !





$ awk -F'[ ,%]' '
NR>3{print ""}
NR>2{printf "%s -> %s\nCPU : %+d%% (because %d-%d)\n",month,$1,$3-usage,$3,usage}
NR>1{month=$1;usage=$3}
' file
July -> August
CPU : +1% (because 20-19)
August -> September
CPU : +0% (because 20-20)
September -> October
CPU : +1% (because 21-20)
October -> November
CPU : +0% (because 21-21)
November -> December
CPU : +0% (because 21-21)
December -> January
CPU : +4% (because 25-21)
January -> February
CPU : +2% (because 27-25)
формат вывода действительно легко настроить даже для новичков. например, если вы хотите более компактный вывод:
$ awk -F'[ ,%]' 'NR>2{printf "%-9s -> %-9s : %+3d%%\n",month,$1,$3-usage} NR>1{month=$1;usage=$3}' file
July -> August : +1%
August -> September : +0%
September -> October : +1%
October -> November : +0%
November -> December : +0%
December -> January : +4%
January -> February : +2%
@Makmy, тебе не нужно объяснение этого, прочитай руководство по awk, и ты получишь его максимум за 10 минут.
Еще awk:
awk -F'[ ,%]' '
FNR>2{print m " -> " $1;printf "CPU : %+d%%%s",$3-u,ORS}
{m=$1;u=$3}
' file
Выход
July -> August
CPU : +1%
August -> September
CPU : +0%
September -> October
CPU : +1%
October -> November
CPU : +0%
November -> December
CPU : +0%
December -> January
CPU : +4%
January -> February
CPU : +2%
Спасибо ! А если я хочу удалить первую строку с «Месяц, ЦП, ОЗУ» и начать с июля? Как это сделать?
@Makmy Прости, я не понял тебя. Этот скрипт автоматически игнорирует первую строку, поскольку она не имеет отношения к нашим вычислениям.
$ awk -F'[ ,]' '
NR>2{ printf "%s -> %s\nCPU : %+d%% ( because %d-%d)\n\n", p[1], $1, $3-p[3], $3, p[3] }
{ split($0,p) }
' file
July -> August
CPU : +1% ( because 20-19)
August -> September
CPU : +0% ( because 20-20)
September -> October
CPU : +1% ( because 21-20)
October -> November
CPU : +0% ( because 21-21)
November -> December
CPU : +0% ( because 21-21)
December -> January
CPU : +4% ( because 25-21)
January -> February
CPU : +2% ( because 27-25)
это печатает дополнительную пустую строку в конце, верно? Я имею в виду, что вы не сделали это случайно
@oguzismail Правильно - он печатает пустую строку после каждой многострочной выходной записи, как если бы вы выполняли операции с многострочной записью в режиме абзаца с помощью RS = ""; ORS = "\n\n".
Это работает хорошо ! Спасибо ! Можете ли вы быстро объяснить 4 строки вашего сценария?