У меня есть входной файл (sample.txt)

Sat 02/28/2015__19:32:37.63 
   262,404 K
   100,964 K
   112,052 K
   124,628 K
Sat 02/28/2015__19:37:38.41 
   262,408 K
   100,964 K
   112,056 K
Sun 02/29/2015__16:32:40.11 
   262,443 K
   100,964 K
   112,052 K
   124,628 K
Sun 02/29/2015__16:32:49.20 
   262,408 K
   100,964 K
   112,022 K

Я хочу напечатать строку с шаблонами Sat и Sun и затем (сумма всех чисел между двумя шаблонами). Я хочу вывести что-то вроде ниже

Sat 02/28/2015__19:32:37.63 
600048 
Sat 02/28/2015__19:37:38.41
475463
Sun 02/29/2015__16:32:40.11
600087
Sun 02/29/2015__16:32:49.20 
475394

1 ответ1

0
$ awk -F, 'NR>1 && /^[SMTWF]/{print sum;f=0} /^S/{print;sum=0;f=1;next} {sum+=$1$2} END{if (f)print sum}' file
Sat 02/28/2015__19:32:37.63 
600048
Sat 02/28/2015__19:37:38.41 
475428
Sun 02/29/2015__16:32:40.11 
600087
Sun 02/29/2015__16:32:49.20 
475394

Как это устроено

  • -F,

    Используйте запятую для разделителя полей.

  • NR>1 && /^[SMTWF]/{print sum;f=0}

    Для любой строки после первой, если она начинается с первой буквы дня недели, выведите сумму.

  • /^S/{print;sum=0;f=1;next}

    Если текущая строка начинается с буквы S (для субботы или воскресенья), то выведите строку, инициализируйте сумму 0, установите флаг f в 1 и перейдите непосредственно к next строке.

  • sum+=$1$2

    Для всех остальных строк добавьте число к sum . awk не поймет запятую, разделяющую цифры. Поскольку в качестве разделителя полей использовалась запятая, то $1$2 - это число без запятой, которое представляет собой форму, понятную awk.

  • END{if (f)print sum}

    Напечатайте последнюю оставшуюся сумму, если мы в настоящее время находимся в группе субботы или воскресенья. Для этого мы используем флаг f . Если последняя группировка была с понедельника по пятницу, то f == 0, и сумма не будет напечатана. Если это была суббота или воскресенье, тогда f == 1, и он будет напечатан.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .