Unix awk模式与if匹配
我想把字段$2乘以.75或.1 我有以下数据:Unix awk模式与if匹配,unix,awk,Unix,Awk,我想把字段$2乘以.75或.1 我有以下数据: Disputed,279 Processed,12112 Uncollected NSF,4732 Declined,14 Invalid / Closed Account,3022 Awk声明: #!/usr/local/bin/gawk -f BEGIN { FPAT="([^,]*)|(\"[^\"]+\")"; FS=OFS=","; OFMT="%.2f"; } { if ($1 "/Disputed|Uncoll
Disputed,279
Processed,12112
Uncollected NSF,4732
Declined,14
Invalid / Closed Account,3022
Awk声明:
#!/usr/local/bin/gawk -f
BEGIN { FPAT="([^,]*)|(\"[^\"]+\")"; FS=OFS=","; OFMT="%.2f"; }
{
if ($1 "/Disputed|Uncollected|Invalid/")
$3 = $2 * .75
else
if ($1 ~ "/Processed|Declined/")
$3 = $2 * 0.10
print
}
if ($1 "/Disputed|Uncollected|Invalid/")
预期产出:
Disputed,279,209.25
Processed,12112,1211.2
Uncollected NSF,4732,3549
Declined,14,1.4
Invalid / Closed Account,3022,2266.5
目前的结果:
Disputed,279,209.25
Processed,12112,9084
Uncollected NSF,4732,3549
Declined,14,10.5
Invalid / Closed Account,3022,2266.5
将其乘以.75:有争议的、未收回的NSF和无效/关闭的账户
这些值乘以。1:已处理和已拒绝
是什么导致所有记录都乘以0.75
编辑:这是我的工作解决方案
#!/usr/local/bin/gawk -f
BEGIN {
FPAT="([^,]*)|(\"[^\"]+\")"
FS=OFS=","
OFMT="%.2f"
print "status","acct type","count","amount"
}
NF>1 {
$4=$3 * ($1 ~ /Processed|Declined/ ? 0.10 : 0.75 )
print
trans+=$3
fee+=$4
}
END {
printf "------------\n"
print "# of transactions: " trans
print "processing fee: " fee
}
是的,有四个字段$2是一个隐藏的特殊领域
status,acct type,count,amount
Processed,Savings,502,50.2
Uncollected NSF,Checking,4299,3224.25
Disputed,Checking,263,197.25
Processed,Checking,11610,1161
Uncollected NSF,Savings,433,324.75
Declined,Checking,14,1.4
Invalid / Closed Account,Checking,2868,2151
Disputed,Savings,16,12
Invalid / Closed Account,Savings,154,115.5
------------
# of transactions: 20159
processing fee: 7237.35
问题
您缺少匹配的运算符~
。本声明:
#!/usr/local/bin/gawk -f
BEGIN { FPAT="([^,]*)|(\"[^\"]+\")"; FS=OFS=","; OFMT="%.2f"; }
{
if ($1 "/Disputed|Uncollected|Invalid/")
$3 = $2 * .75
else
if ($1 ~ "/Processed|Declined/")
$3 = $2 * 0.10
print
}
if ($1 "/Disputed|Uncollected|Invalid/")
始终计算为true,因为它检查$1
与“/discoverted | Uncollected | Invalid/”
的串联是否为空,并且不是空的
请尝试:
if ($1 ~ /Disputed|Uncollected|Invalid/)
示例
您可以使用以下一行程序查看此行为:
$ awk 'BEGIN { if ("" "a") { print "true" } else { print "false" }}'
true
$ awk 'BEGIN { if ("" "") { print "true" } else { print "false" }}'
false
$ awk 'BEGIN { if ("") { print "true" } else { print "false" }}'
false
$ awk 'BEGIN { if (RS FS "a") { print "true" } else { print "false" }}'
true
$ awk 'BEGIN { if (variable) { print "true" } else { print "false" }}'
false
$ awk 'BEGIN { var="0"; if (var) { print "true" } else { print "false" }}'
true
问题
您缺少匹配的运算符~
。本声明:
#!/usr/local/bin/gawk -f
BEGIN { FPAT="([^,]*)|(\"[^\"]+\")"; FS=OFS=","; OFMT="%.2f"; }
{
if ($1 "/Disputed|Uncollected|Invalid/")
$3 = $2 * .75
else
if ($1 ~ "/Processed|Declined/")
$3 = $2 * 0.10
print
}
if ($1 "/Disputed|Uncollected|Invalid/")
始终计算为true,因为它检查$1
与“/discoverted | Uncollected | Invalid/”
的串联是否为空,并且不是空的
请尝试:
if ($1 ~ /Disputed|Uncollected|Invalid/)
示例
您可以使用以下一行程序查看此行为:
$ awk 'BEGIN { if ("" "a") { print "true" } else { print "false" }}'
true
$ awk 'BEGIN { if ("" "") { print "true" } else { print "false" }}'
false
$ awk 'BEGIN { if ("") { print "true" } else { print "false" }}'
false
$ awk 'BEGIN { if (RS FS "a") { print "true" } else { print "false" }}'
true
$ awk 'BEGIN { if (variable) { print "true" } else { print "false" }}'
false
$ awk 'BEGIN { var="0"; if (var) { print "true" } else { print "false" }}'
true
正如另一张海报所说,您在第一个正则表达式之前遗漏了
~
操作符
另外,不要在正则表达式的开头和结尾包含斜杠。可以将正则表达式用斜杠(如Perl/Ruby/JavaScript)或引号括起来,但不能同时用斜杠和引号括起来
if ($1 ~ "Disputed|Uncollected|Invalid")
$3 = $2 * .75
else
if ($1 ~ "Processed|Declined")
$3 = $2 * 0.10
print
正如另一张海报所说,您在第一个正则表达式之前遗漏了
~
操作符
另外,不要在正则表达式的开头和结尾包含斜杠。可以将正则表达式用斜杠(如Perl/Ruby/JavaScript)或引号括起来,但不能同时用斜杠和引号括起来
if ($1 ~ "Disputed|Uncollected|Invalid")
$3 = $2 * .75
else
if ($1 ~ "Processed|Declined")
$3 = $2 * 0.10
print
用awk编写代码的方法是使用三元表达式,例如:
$ awk 'BEGIN{FS=OFS=","} {print $0, $2 * ($1 ~ /Processed|Declined/ ? 0.10 : 0.75)}' file
Disputed,279,209.25
Processed,12112,1211.2
Uncollected NSF,4732,3549
Declined,14,1.4
Invalid / Closed Account,3022,2266.5
请注意,regexp常量由/
(请参阅)分隔,但awk可以从变量和/或字符串常量(请参阅)构造动态regexp,因此在编写以下代码时:
"/Processed|Declined/"
在适用于动态regexp($1~
)的上下文中,awk将其构造为一个regexp:
`/Processed` OR `Declined/`
(注意作为regexp术语的一部分的文字/
字符)而不是您想要的:
`Processed` OR `Declined`
你可以在这里看到这种效果:
$ echo 'abc' | awk '$0 ~ /b|x/'
abc
$ echo 'abc' | awk '$0 ~ "/b|x/"'
$ echo 'a/bc' | awk '$0 ~ "/b|x/"'
a/bc
现在,看看你是否能解决这个问题:
$ echo 'abc' | awk '$0 ~ "/b|x/"'
$ echo 'abc' | awk '"/b|x/"'
abc
i、 e.为什么第一个只打印输入,而第二个只打印输入。用awk编写代码的方法是使用三元表达式,例如:
$ awk 'BEGIN{FS=OFS=","} {print $0, $2 * ($1 ~ /Processed|Declined/ ? 0.10 : 0.75)}' file
Disputed,279,209.25
Processed,12112,1211.2
Uncollected NSF,4732,3549
Declined,14,1.4
Invalid / Closed Account,3022,2266.5
请注意,regexp常量由/
(请参阅)分隔,但awk可以从变量和/或字符串常量(请参阅)构造动态regexp,因此在编写以下代码时:
"/Processed|Declined/"
在适用于动态regexp($1~
)的上下文中,awk将其构造为一个regexp:
`/Processed` OR `Declined/`
(注意作为regexp术语的一部分的文字/
字符)而不是您想要的:
`Processed` OR `Declined`
你可以在这里看到这种效果:
$ echo 'abc' | awk '$0 ~ /b|x/'
abc
$ echo 'abc' | awk '$0 ~ "/b|x/"'
$ echo 'a/bc' | awk '$0 ~ "/b|x/"'
a/bc
现在,看看你是否能解决这个问题:
$ echo 'abc' | awk '$0 ~ "/b|x/"'
$ echo 'abc' | awk '"/b|x/"'
abc
i、 e.为什么第一个字段只打印输入,而第二个字段只打印输入。对于~,我必须准确地输入字段$1名称。因此,这意味着无效/关闭的帐户将需要在awk语句中,而不仅仅是
Invalid
,~
将进行部分匹配,它将*
添加到正则表达式的开头和结尾。对于~,我必须精确地拥有字段$1名称。因此,这意味着无效/关闭的帐户将需要出现在awk语句中,而不仅仅是无效
,~
将进行部分匹配,它将*
添加到正则表达式的开头和结尾。我认为可以使用正斜杠:适当注意-编辑以反映这一点。(很抱歉,有一段时间没有在awk中做任何严肃的事情。)去掉另外,不要在正则表达式的开头和结尾包含斜杠。可以将正则表达式用斜杠(如Perl/Ruby/JavaScript)或引号括起来,但不能同时用斜杠和引号括起来。
因为第一句是100%错误的,第二句让人觉得这两个分隔符是等价的。这是一个regexp,所以请使用regexp分隔符/
,不要强迫awk从字符串分隔符包围的文本中构造regexp。我认为可以使用正斜杠:适当注意-编辑以反映这一点。(很抱歉,有一段时间没有在awk中做任何严肃的事情。)去掉另外,不要在正则表达式的开头和结尾包含斜杠。可以将正则表达式用斜杠(如Perl/Ruby/JavaScript)或引号括起来,但不能同时用斜杠和引号括起来。
因为第一句是100%错误的,第二句让人觉得这两个分隔符是等价的。这是一个regexp,所以请使用regexp分隔符/
,不要强制awk从字符串分隔符包围的文本构造regexp。如果您有一些模式,而不是有争议的、未收集的、无效的、已处理的、已拒绝的,该怎么办?您没有最后的else
子句,因此您不需要添加$3
,只需打印输入数据。但这是一个逻辑问题,与你所看到的行为完全不同,答案已经解决了这个问题。我真的应该把这三个.75的值乘以0.10。我愿意改进!好啊因此,删除第二个if
,让else
简单地乘以0.10。如果您有一些模式,而不是有争议的、未收集的、无效的、已处理的、已拒绝的,那么会发生什么?您没有最后的else
子句,因此您不需要添加$3
,只需打印输入数据。但这是一个逻辑问题,与你所看到的行为完全不同,答案已经解决了这个问题。我真的应该把这三个.75的值乘以0.10。我愿意改进!好啊因此,去掉第二个if
,让else
简单地乘以