Вычитать определенные поля из строк в файлах csv

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

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

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

Спасибо !

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
67
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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%

Это работает хорошо ! Спасибо ! Можете ли вы быстро объяснить 4 строки вашего сценария?

Makmy 15.04.2019 14:20

@Makmy, тебе не нужно объяснение этого, прочитай руководство по awk, и ты получишь его максимум за 10 минут.

oguz ismail 15.04.2019 14:43

Еще 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 15.04.2019 15:48

@Makmy Прости, я не понял тебя. Этот скрипт автоматически игнорирует первую строку, поскольку она не имеет отношения к нашим вычислениям.

sjsam 15.04.2019 15:51
$ 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)

это печатает дополнительную пустую строку в конце, верно? Я имею в виду, что вы не сделали это случайно

oguz ismail 15.04.2019 17:13

@oguzismail Правильно - он печатает пустую строку после каждой многострочной выходной записи, как если бы вы выполняли операции с многострочной записью в режиме абзаца с помощью RS = ""; ORS = "\n\n".

Ed Morton 15.04.2019 17:30

Другие вопросы по теме