вычесть конкретные поля как из строк в CSV-файлах - PullRequest
0 голосов
/ 15 апреля 2019

У меня есть этот файл:

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 и т. Д.), Необязательно иметь то же представление, что и в моем примере.

Пожалуйста, вы можете показать мне?

Спасибо!

Ответы [ 3 ]

3 голосов
/ 15 апреля 2019
$ 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%
1 голос
/ 15 апреля 2019
$ 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)
0 голосов
/ 15 апреля 2019

Другое 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%
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...