Linux AWK计数-奇怪的行为

Linux AWK计数-奇怪的行为,linux,bash,shell,awk,Linux,Bash,Shell,Awk,我有一个包含以下格式的csv 字段1、字段2、成功计数、失败计数 我编写了一个awk脚本来计算字段2值的成功计数和失败计数之和。这个脚本似乎很好用。但突然间,它表现得很奇怪。 它甚至在开始计数之前就加了2。因此,结果将比实际结果大两倍。下面是我的脚本 sed 's/\r//' FileName.csv | grep 'HTTP Requests - POST' | awk -F "," '{failure += $3; success += $4} END {print "HTTP Reques

我有一个包含以下格式的csv

字段1、字段2、成功计数、失败计数

我编写了一个awk脚本来计算字段2值的成功计数和失败计数之和。这个脚本似乎很好用。但突然间,它表现得很奇怪。 它甚至在开始计数之前就加了2。因此,结果将比实际结果大两倍。下面是我的脚本

sed 's/\r//' FileName.csv | grep 'HTTP Requests - POST' | awk -F "," '{failure += $3; success += $4} END {print "HTTP Requests - POST,  Failure : " failure " Success : "success " Total : " success+failure;}'
然后我在执行时添加了“打印成功”。 它打印在下面

2
9
27

有人能帮忙吗



CSV如下所示。



sed用于删除windows换行符,并将其替换为linux换行符。
Grep仅用于过滤POST请求


根据下面@glenn的回答,我尝试了这个。 见下面的输出

awk -F "," '/\/GET/ { sub(/\r$/,""); failure += $3; success += $4; print failure; print success; print ""; } END  {print "HTTP Requests - POST,  Failure : " failure " Success : "success " Total : " success+failure}' Sandbox.csv
0
2

0
9

0
27
预期产量
HTTP请求-POST,失败:0成功:25总数:25

使用awk时不需要sed和grep:

awk -F "," '
    /POST/ {
        sub(/\r$/,"")
        failure += $3
        success += $4
        print success
    }
    END {print "HTTP Requests - POST,  Failure : " failure " Success : "success " Total : " success+failure}
' FileName.csv

此外,第3列似乎是成功的,第4列是失败的,但是您的代码中的变量是相反的。这能解释这种奇怪的行为吗?

所以你计算了一些我们看不到的东西,希望我们能告诉你为什么答案是错的?如果您需要帮助,请提供所有必要的信息。您还需要什么信息。我提供了CSV格式和命令。还需要什么吗?它所做的是遍历csv,并提供第三列和第四列的总和,即成功计数和失败计数。csv会有所帮助。并解释为什么需要通过
sed
。为什么您也需要通过
grep
来传递它-搜索描述中未提及的内容。已编辑的问题请不要将代码或数据放在注释中-这真的很难解释。相反,请单击问题下方的
edit
,然后通过选择问题并单击
{}
按钮来更新问题并将CSV格式化为代码。非常感谢您提供有关awk的精彩指南。但即使文件中的失败计数为零,它仍然显示一个表示失败。奇怪的是,我尝试在每个步骤上用awk打印成功和失败。在POST故障中,从1开始,而不是从零开始。在GET success中,从2开始。使用示例输出编辑问题。这是该csv的输出吗?这些数字没有任何意义,如果是的话。。。第一个成功是10….@buddhika,BenPen的评论是给你的。考虑到您发布的输入,您希望得到什么输出?
awk -F "," '/\/GET/ { sub(/\r$/,""); failure += $3; success += $4; print failure; print success; print ""; } END  {print "HTTP Requests - POST,  Failure : " failure " Success : "success " Total : " success+failure}' Sandbox.csv
0
2

0
9

0
27
awk -F "," '
    /POST/ {
        sub(/\r$/,"")
        failure += $3
        success += $4
        print success
    }
    END {print "HTTP Requests - POST,  Failure : " failure " Success : "success " Total : " success+failure}
' FileName.csv