awk+;简单示例+;输出不符合预期+;文件中的总和和计数值

awk+;简单示例+;输出不符合预期+;文件中的总和和计数值,awk,Awk,这是我的档案: $ cat inventory-shipped Jan 13 25 15 115 Feb 15 32 24 226 Mar 15 24 34 228 Apr 31 52 63 420 May 16 34 29 208 Jun 31 42 75 492 Jul 24 34 67 436 Aug 15 34 47 316 Sep 13 55 37 277 Oct 29 54 68 525 Nov 20 87 82 577 Dec 17 35 61 401 Jan 21 36 64 6

这是我的档案:

$ cat inventory-shipped
Jan 13 25 15 115
Feb 15 32 24 226
Mar 15 24 34 228
Apr 31 52 63 420
May 16 34 29 208
Jun 31 42 75 492
Jul 24 34 67 436
Aug 15 34 47 316
Sep 13 55 37 277
Oct 29 54 68 525
Nov 20 87 82 577
Dec 17 35 61 401
Jan 21 36 64 620
Feb 26 58 80 652
Mar 24 75 70 495
Apr 21 70 74 514
这就是我想要实现的目标:(它将第1列中的任何内容与“/Dec/”匹配,计算此发生率,并根据此发生率对第2列求和)

这是我的尝试,我将上面的值
Dec
存储在变量j
$echo“$j”##Dec
中。因此,我希望得到与上述
dec117
相同的输出,即3个字段,但这里我只得到
Dec
,即1个字段

$ awk -v k="$j" '$1 ~ /k/ {count++; sum+=$2} END {printf ("%s" FS count FS sum,k)}' inventory-shipped
Dec
这是我的第二次尝试:

$ awk -v k="$j" '$1 ~ /k/ {count++; sum+=$2} END {printf (k FS count FS sum)}' inventory-shipped
Dec
但它不是我想要的打印总和或计数值有人能告诉我我做错了什么吗


编辑1 下面是@Ed的答案,这就是我想要的:

$ j="Dec"

$ echo "$j"
Dec

//this gives me what i want if I use the equals comparison operation
$ awk -v k="$j" '$1 == k{count++; sum+=$2} END{print k, count+0, sum+0}' inventory-shipped
Dec 1 17
但是如果我想使用regex比较运算m,我将如何编写它呢?我假设我会得到同样的结果,但我只是想知道如何让正则表达式工作。这是我的尝试:

$ awk -v k="$j" '$1 ~ /k/{count++; sum+=$2} END{print k, count+0, sum+0}' inventory-shipped
Dec 0 0

您试图在一个变量中使用一个变量。不过,无论如何,您不需要/不需要对此进行regexp比较,只需进行字符串比较:

awk -v k="$j" '$1 == k{count++; sum+=$2} END{print k, count+0, sum+0}' inventory-shipped
+0
s是空的,因此即使文件为空,也可以获得数字输出

以下是将字符串和regexp与awk进行比较的基本语法:

  • 使用常量字符串进行字符串比较:
    $0==“foo”
  • 使用变量中的字符串进行字符串比较:
    {myvar=“foo”}$0==myvar
  • 比较:
    $0~/foo/
  • 使用常量字符串进行比较:
    $0~“foo”
  • 在变量中使用字符串进行比较:
    {myvar=“foo”}$0~myvar
Regexp常量和动态Regexp之间的一个重要区别是后者被解析两次,第一次是将字符串转换为Regexp,第二次是将其作为Regexp求值。因此,与Regexp常量比较
$0~/a\tb/
等效的是带有动态Regexp的
$0~“a\\tb”
,因为字符串->Regexp转换将使用单个转义字符

因此,避免gotchas的一般规则是——尽可能使用Regexp常量,并且仅在需要时使用动态Regexp,例如,在比较之前将字符串与变量连接起来。该规则也适用于函数参数,如*sub()、split()和match(),而不仅仅是比较运算符


有关使用regexp的更多信息,请参阅。

tks,我们已尝试对其进行更好的解释。tks请参阅Q中的我的EDIT1。如果我想使用regex比较运算m,我将如何编写它?那么
k
将包含一个so
$1~k
。我编辑了我的问题,以展示各种风格的字符串和regexp比较。非常感谢!
awk -v k="$j" '$1 == k{count++; sum+=$2} END{print k, count+0, sum+0}' inventory-shipped