Windows 当数字被引用时,我不知道如何用grep和awk对数字进行汇总
我有grep命令Windows 当数字被引用时,我不知道如何用grep和awk对数字进行汇总,windows,awk,grep,Windows,Awk,Grep,我有grep命令grep-I“grep-I”的输出,理想情况下,您应该使用xml解析器来处理这类事情 下面是一个脆弱的解决方案,如果字段的顺序发生变化,它将不起作用,但您可以使用引号“作为带有awk-F\”的字段分隔符,而不是默认的空白,并检索正确的值: grep -i "<Project" dottest\report.xml | awk -F \" '{ SUM += $4; print $3$4 } END { print SUM }' 理想情况下,您应该使用xml解析器来处理这
grep-I“grep-I”的输出,理想情况下,您应该使用xml解析器来处理这类事情
下面是一个脆弱的解决方案,如果字段的顺序发生变化,它将不起作用,但您可以使用引号“
作为带有awk-F\”
的字段分隔符,而不是默认的空白,并检索正确的值:
grep -i "<Project" dottest\report.xml | awk -F \" '{ SUM += $4; print $3$4 } END { print SUM }'
理想情况下,您应该使用xml解析器来处理这类事情
下面是一个脆弱的解决方案,如果字段的顺序发生变化,它将不起作用,但您可以使用引号“
作为带有awk-F\”
的字段分隔符,而不是默认的空白,并检索正确的值:
grep -i "<Project" dottest\report.xml | awk -F \" '{ SUM += $4; print $3$4 } END { print SUM }'
为什么要运行grep和awk
awk '/Projects/ { n=match($0, /bdTotalFiles="([[:digit:]]+)"/, r); sum +=r[1]; } END { print sum; }'
这只运行awk。如果行中有字符串项目,则进行求和,然后在bdTotalFiles=string之后查找数字。如果你的报价是可选的,你可以把一个?在“s”之后进入正则表达式,很容易扩展到多个列。未经测试。为什么要运行grep和awk
awk '/Projects/ { n=match($0, /bdTotalFiles="([[:digit:]]+)"/, r); sum +=r[1]; } END { print sum; }'
这只运行awk。如果行中有字符串项目,则进行求和,然后在bdTotalFiles=string之后查找数字。如果您的引号是可选的,则可以在“s”之后的正则表达式中加一个“?”。而且很容易扩展到多个列。未测试。一个衬里
awk 'match($0, /bdTotalFiles="[0-9]+"/){s=substr($0,RSTART,RLENGTH); print s; gsub(/[^0-9]+/,"",s); total+=s}END{print "Sum",total}' file
解释
awk '
match($0, /bdTotalFiles="[0-9]+"/){ # Search for match (bdTotalFiles="[0-9]+") in current record/row ($0), if found do things inside braces
s=substr($0,RSTART,RLENGTH) # extract matched part from current record ($0) and assign to variable s
print s # print extracted contents (contents of variable s)
gsub(/[^0-9]+/,"",s) # extract only numbers, remove anything except numeric values from extracted contents of variable s
total+=s # sum up values
}
END{
print "Sum",total # finally print sum
}
' file # Input file
输入
$ cat f
<Project bdCheckedFiles="8" bdTotalFiles="8" checkedFiles="8" checkedLns="870" name="Common" qfixErrs="0" suppErrs="0" totErrs="228" totFiles="8" totLns="870" />
<Project bdCheckedFiles="11" bdTotalFiles="11" checkedFiles="11" checkedLns="1440" name="Common.EW" qfixErrs="0" suppErrs="0" totErrs="263" totFiles="11" totLns="1440" />
<Project bdCheckedFiles="10" bdTotalFiles="10" checkedFiles="10" checkedLns="552" name="Common.EW.Interfaces" qfixErrs="0" suppErrs="0" totErrs="119" totFiles="10" totLns="552" />
<Project bdCheckedFiles="8" bdTotalFiles="8" checkedFiles="8" checkedLns="2740" name="Common.EW.Messages" qfixErrs="0" suppErrs="0" totErrs="976" totFiles="8" totLns="2740" />
<Project bdCheckedFiles="6" bdTotalFiles="6" checkedFiles="6" checkedLns="2152" name="DataModel" qfixErrs="0" suppErrs="0" totErrs="922" totFiles="6" totLns="2152" />
<Project bdCheckedFiles="5" bdTotalFiles="5" checkedFiles="5" checkedLns="745" name="ExternalMessages" qfixErrs="0" suppErrs="0" totErrs="507" totFiles="5" totLns="745" />
<Project bdCheckedFiles="0" bdTotalFiles="0" checkedFiles="0" checkedLns="0" name="Resources" qfixErrs="0" suppErrs="0" totErrs="0" totFiles="7" totLns="996" />
<Project bdCheckedFiles="3" bdTotalFiles="3" checkedFiles="3" checkedLns="725" name="ScriptReader" qfixErrs="0" suppErrs="0" totErrs="373" totFiles="3" totLns="725" />
<Project bdCheckedFiles="7" bdTotalFiles="7" checkedFiles="7" checkedLns="1812" name="TestController" qfixErrs="0" suppErrs="0" totErrs="594" totFiles="7" totLns="1812" />
<Project bdCheckedFiles="10" bdTotalFiles="10" checkedFiles="10" checkedLns="1232" name="TestControllerCli" qfixErrs="0" suppErrs="0" totErrs="88" totFiles="10" totLns="1232" />
<Project bdCheckedFiles="16" bdTotalFiles="16" checkedFiles="16" checkedLns="1742" name="TestControllerGui" qfixErrs="0" suppErrs="0" totErrs="125" totFiles="16" totLns="1742" />
<Project bdCheckedFiles="2" bdTotalFiles="2" checkedFiles="2" checkedLns="790" name="UnitTest_Common" qfixErrs="0" suppErrs="0" totErrs="162" totFiles="2" totLns="790" />
<Project bdCheckedFiles="4" bdTotalFiles="4" checkedFiles="4" checkedLns="1629" name="UnitTest_DataModel" qfixErrs="0" suppErrs="0" totErrs="586" totFiles="4" totLns="1629" />
<Project bdCheckedFiles="2" bdTotalFiles="2" checkedFiles="2" checkedLns="1479" name="UnitTest_ExternalMessages" qfixErrs="0" suppErrs="0" totErrs="591" totFiles="2" totLns="1479" />
<Project bdCheckedFiles="9" bdTotalFiles="9" checkedFiles="9" checkedLns="1117" name="UnitTest_ScriptReader" qfixErrs="0" suppErrs="0" totErrs="29" totFiles="9" totLns="1117" />
<Project bdCheckedFiles="9" bdTotalFiles="9" checkedFiles="9" checkedLns="1509" name="UnitTest_TestController" qfixErrs="0" suppErrs="0" totErrs="144" totFiles="9" totLns="1509" />
$ awk 'match($0, /bdTotalFiles="[0-9]+"/){s=substr($0,RSTART,RLENGTH); print s; gsub(/[^0-9]+/,"",s); total+=s}END{print "Sum",total}' f
bdTotalFiles="8"
bdTotalFiles="11"
bdTotalFiles="10"
bdTotalFiles="8"
bdTotalFiles="6"
bdTotalFiles="5"
bdTotalFiles="0"
bdTotalFiles="3"
bdTotalFiles="7"
bdTotalFiles="10"
bdTotalFiles="16"
bdTotalFiles="2"
bdTotalFiles="4"
bdTotalFiles="2"
bdTotalFiles="9"
bdTotalFiles="9"
Sum 110
一行
awk 'match($0, /bdTotalFiles="[0-9]+"/){s=substr($0,RSTART,RLENGTH); print s; gsub(/[^0-9]+/,"",s); total+=s}END{print "Sum",total}' file
解释
awk '
match($0, /bdTotalFiles="[0-9]+"/){ # Search for match (bdTotalFiles="[0-9]+") in current record/row ($0), if found do things inside braces
s=substr($0,RSTART,RLENGTH) # extract matched part from current record ($0) and assign to variable s
print s # print extracted contents (contents of variable s)
gsub(/[^0-9]+/,"",s) # extract only numbers, remove anything except numeric values from extracted contents of variable s
total+=s # sum up values
}
END{
print "Sum",total # finally print sum
}
' file # Input file
输入
$ cat f
<Project bdCheckedFiles="8" bdTotalFiles="8" checkedFiles="8" checkedLns="870" name="Common" qfixErrs="0" suppErrs="0" totErrs="228" totFiles="8" totLns="870" />
<Project bdCheckedFiles="11" bdTotalFiles="11" checkedFiles="11" checkedLns="1440" name="Common.EW" qfixErrs="0" suppErrs="0" totErrs="263" totFiles="11" totLns="1440" />
<Project bdCheckedFiles="10" bdTotalFiles="10" checkedFiles="10" checkedLns="552" name="Common.EW.Interfaces" qfixErrs="0" suppErrs="0" totErrs="119" totFiles="10" totLns="552" />
<Project bdCheckedFiles="8" bdTotalFiles="8" checkedFiles="8" checkedLns="2740" name="Common.EW.Messages" qfixErrs="0" suppErrs="0" totErrs="976" totFiles="8" totLns="2740" />
<Project bdCheckedFiles="6" bdTotalFiles="6" checkedFiles="6" checkedLns="2152" name="DataModel" qfixErrs="0" suppErrs="0" totErrs="922" totFiles="6" totLns="2152" />
<Project bdCheckedFiles="5" bdTotalFiles="5" checkedFiles="5" checkedLns="745" name="ExternalMessages" qfixErrs="0" suppErrs="0" totErrs="507" totFiles="5" totLns="745" />
<Project bdCheckedFiles="0" bdTotalFiles="0" checkedFiles="0" checkedLns="0" name="Resources" qfixErrs="0" suppErrs="0" totErrs="0" totFiles="7" totLns="996" />
<Project bdCheckedFiles="3" bdTotalFiles="3" checkedFiles="3" checkedLns="725" name="ScriptReader" qfixErrs="0" suppErrs="0" totErrs="373" totFiles="3" totLns="725" />
<Project bdCheckedFiles="7" bdTotalFiles="7" checkedFiles="7" checkedLns="1812" name="TestController" qfixErrs="0" suppErrs="0" totErrs="594" totFiles="7" totLns="1812" />
<Project bdCheckedFiles="10" bdTotalFiles="10" checkedFiles="10" checkedLns="1232" name="TestControllerCli" qfixErrs="0" suppErrs="0" totErrs="88" totFiles="10" totLns="1232" />
<Project bdCheckedFiles="16" bdTotalFiles="16" checkedFiles="16" checkedLns="1742" name="TestControllerGui" qfixErrs="0" suppErrs="0" totErrs="125" totFiles="16" totLns="1742" />
<Project bdCheckedFiles="2" bdTotalFiles="2" checkedFiles="2" checkedLns="790" name="UnitTest_Common" qfixErrs="0" suppErrs="0" totErrs="162" totFiles="2" totLns="790" />
<Project bdCheckedFiles="4" bdTotalFiles="4" checkedFiles="4" checkedLns="1629" name="UnitTest_DataModel" qfixErrs="0" suppErrs="0" totErrs="586" totFiles="4" totLns="1629" />
<Project bdCheckedFiles="2" bdTotalFiles="2" checkedFiles="2" checkedLns="1479" name="UnitTest_ExternalMessages" qfixErrs="0" suppErrs="0" totErrs="591" totFiles="2" totLns="1479" />
<Project bdCheckedFiles="9" bdTotalFiles="9" checkedFiles="9" checkedLns="1117" name="UnitTest_ScriptReader" qfixErrs="0" suppErrs="0" totErrs="29" totFiles="9" totLns="1117" />
<Project bdCheckedFiles="9" bdTotalFiles="9" checkedFiles="9" checkedLns="1509" name="UnitTest_TestController" qfixErrs="0" suppErrs="0" totErrs="144" totFiles="9" totLns="1509" />
$ awk 'match($0, /bdTotalFiles="[0-9]+"/){s=substr($0,RSTART,RLENGTH); print s; gsub(/[^0-9]+/,"",s); total+=s}END{print "Sum",total}' f
bdTotalFiles="8"
bdTotalFiles="11"
bdTotalFiles="10"
bdTotalFiles="8"
bdTotalFiles="6"
bdTotalFiles="5"
bdTotalFiles="0"
bdTotalFiles="3"
bdTotalFiles="7"
bdTotalFiles="10"
bdTotalFiles="16"
bdTotalFiles="2"
bdTotalFiles="4"
bdTotalFiles="2"
bdTotalFiles="9"
bdTotalFiles="9"
Sum 110
@伊尼安啊,对不起,是的,这是该列中所有数字的总和。因此,如果我们使用bdTotalFiles,那么输出将是110。(8 + 11 + 10 ... + 9)你用bash
标记了你的问题,但是你的提示D:\workspace>
看起来像是在Windows上看到的,你的文件名dottest\report.xml
或者包含\r
介于dottest
和eport.xml
之间,这会很奇怪,或者代表目录的Windows路径dottest
和文件report.xml
。你真的在UNIX/bash上还是在Windows上?@EdMorton true,我在Windows上使用linux命令。但是我想使用linux/bash命令集,而不是windows,所以我认为用bash标记比用windows标记更合适:)这有点像是请求帮助更换你家的windows,然后告诉我们它是潜艇。YMMV为您提供了从回复中获得的好处。你能安装cygwin吗?@EdMorton我明白你的意思。但我也希望能够在linux上使用我的脚本。我希望它是理想的操作系统不可知,因为它将使用grep和awk等。。。因此,专门设置“窗口”似乎是错误的。我将删除bash标记并将windows放入以确保正确性。@Inian啊,对不起,是的,这是该列中所有数字的总和。因此,如果我们使用bdTotalFiles,那么输出将是110。(8 + 11 + 10 ... + 9)你用bash
标记了你的问题,但是你的提示D:\workspace>
看起来像是在Windows上看到的,你的文件名dottest\report.xml
或者包含\r
介于dottest
和eport.xml
之间,这会很奇怪,或者代表目录的Windows路径dottest
和文件report.xml
。你真的在UNIX/bash上还是在Windows上?@EdMorton true,我在Windows上使用linux命令。但是我想使用linux/bash命令集,而不是windows,所以我认为用bash标记比用windows标记更合适:)这有点像是请求帮助更换你家的windows,然后告诉我们它是潜艇。YMMV为您提供了从回复中获得的好处。你能安装cygwin吗?@EdMorton我明白你的意思。但我也希望能够在linux上使用我的脚本。我希望它是理想的操作系统不可知,因为它将使用grep和awk等。。。因此,专门设置“窗口”似乎是错误的。我将删除bash标签,然后将windows放入以确保正确性。谢谢至于“为什么要运行grep和awk”,因为我不知道更好,但我现在知道:)谢谢至于“为什么要运行grep和awk”,因为我不太清楚,但我现在知道了:)谢谢,很好的修复:)。。。我不想要一个重量级的xml解析器。这是一个小脚本,如果语法发生任何变化,我希望它失败。谢谢,很好的修复:)。。。我不想要一个重量级的xml解析器。这是一个小脚本,如果语法发生任何变化,我希望它失败。谢谢,很好的解决方案和很好的解释:)。因为有额外的解释,所以将这一个标记为答案-但所有其他答案也都很好。谢谢,很好的解决方案和很好的解释:)。因为有额外的解释,所以将这一个标记为答案-但所有其他答案也都很好。