![如何用模式添加两行之间的所有整数并打印](https://linux22.com/image/1444309/%E5%A6%82%E4%BD%95%E7%94%A8%E6%A8%A1%E5%BC%8F%E6%B7%BB%E5%8A%A0%E4%B8%A4%E8%A1%8C%E4%B9%8B%E9%97%B4%E7%9A%84%E6%89%80%E6%9C%89%E6%95%B4%E6%95%B0%E5%B9%B6%E6%89%93%E5%8D%B0.png)
我有一个输入文件(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
对于所有其他行,将数字添加到
sum
。awk
无法理解分隔数字的逗号。由于逗号用作字段分隔符,因此$1$2
是没有逗号的数字,这是 awk 可以理解的形式。END{if (f)print sum}
如果我们当前处于星期六或星期日组,则打印最后剩余的总数。为此,我们使用标志
f
。如果最后一个分组是星期一到星期五,则 f==0,总数不会打印。如果是星期六或星期日,则 f==1,总数会打印。