Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix awk模式与if匹配_Unix_Awk - Fatal编程技术网

Unix awk模式与if匹配

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

我想把字段$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|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
简单地乘以