这是我的档案:
$ 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
这就是我想要实现的目标:(它将column1中的任何内容与'/ Dec /'匹配,它计算出这种情况,并根据此情况对第2列求和)
$ awk '$1 ~ /Dec/ {count++; sum+=$2} END {printf ("Dec" FS count FS sum)}' inventory-shipped
Dec 1 17
这是我尝试将值Dec
存储在变量j $ echo "$j" ##Dec
中。所以我希望输出与Dec 1 17
之上相同的输出,即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
但它不打印我想要的总和或计数值。 任何人都可以告知我的错误
向@ 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
但是如果我想使用正则表达式比较操作,怎么写呢?我假设我会得到相同的结果,但我只是想知道如何使正则表达式工作。这是我的尝试:
$ awk -v k="$j" '$1 ~ /k/{count++; sum+=$2} END{print k, count+0, sum+0}' inventory-shipped
Dec 0 0
答案 0 :(得分:3)
您试图在regexp constant内使用变量。尽管如此,你不需要/想要一个正则表达式比较,只是一个字符串比较:
awk -v k="$j" '$1 == k{count++; sum+=$2} END{print k, count+0, sum+0}' inventory-shipped
即使文件为空,+0
也可以获得数字输出。
以下是将字符串和正则表达式与awk进行比较的基本语法:
$0 == "foo"
{myvar="foo"} $0 == myvar
$0 ~ /foo/
$0 ~ "foo"
{myvar="foo"} $0 ~ myvar
Regexp Constants和Dynamic Regexps之间的一个重要区别是后者被解析两次,第一次将字符串转换为正则表达式,第二次将其作为正则表达式进行求解。因此,Regexp Constant比较$0 ~ /a\tb/
的等价物将是$0 ~ "a\\tb"
和Dynamic Regexp,因为单个转义字符会被字符串 - > regexp转换用尽。
因此,避免陷阱的一般规则是 - 尽可能使用Regexp常量,并且只在需要时使用Dynamic Regexp,例如:在比较之前将字符串与变量连接起来。该规则也适用于* sub(),split()和match()等函数参数,而不仅仅是比较运算符。
有关使用正则表达式的详细信息,请参阅https://www.gnu.org/software/gawk/manual/gawk.html#Regexp。