como adicionar todos os inteiros entre duas linhas com um padrão e imprimir

0

Eu tenho um arquivo de entrada (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

Eu quero imprimir a linha com padrões Sat e Sun e depois (soma de todos os números entre os dois padrões). Eu quero mostrar algo como abaixo

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
    
por Anil 19.03.2015 / 08:18

1 resposta

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

Como funciona

  • -F,

    Use uma vírgula para o separador de campos.

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

    Para qualquer linha após a primeira, se começar com a primeira letra de um dia da semana, imprima a soma.

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

    Se a linha atual começar com a letra S (para sábado ou domingo), imprima a linha, inicialize a soma como 0, defina o sinalizador f para 1 e pule diretamente para a linha next . / p>

  • sum+=$1$2

    Para todas as outras linhas, adicione o número a sum . awk não entenderia uma vírgula separando os dígitos. Desde que uma vírgula foi usada como o separador de campo, então $1$2 é o número sem a vírgula, que é um formulário que o awk entenderá.

  • END{if (f)print sum}

    Imprima a última soma restante se estivermos atualmente em um grupo de sábado ou domingo. Para conseguir isso, usamos o sinalizador f . Se o último agrupamento foi de segunda a sexta, então f == 0 e a soma não será impressa. Se foi sábado ou domingo, então f == 1 e será impresso.

por 19.03.2015 / 08:37