如何用模式添加两行之间的所有整数并打印

如何用模式添加两行之间的所有整数并打印

我有一个输入文件(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

$ 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

    对于所有其他行,将数字添加到sumawk无法理解分隔数字的逗号。由于逗号用作字段分隔符,因此$1$2是没有逗号的数字,这是 awk 可以理解的形式。

  • END{if (f)print sum}

    如果我们当前处于星期六或星期日组,则打印最后剩余的总数。为此,我们使用标志f。如果最后一个分组是星期一到星期五,则 f==0,总数不会打印。如果是星期六或星期日,则 f==1,总数会打印。

相关内容