Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.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
Windows 当数字被引用时,我不知道如何用grep和awk对数字进行汇总_Windows_Awk_Grep - Fatal编程技术网

Windows 当数字被引用时,我不知道如何用grep和awk对数字进行汇总

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命令
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解析器。这是一个小脚本,如果语法发生任何变化,我希望它失败。谢谢,很好的解决方案和很好的解释:)。因为有额外的解释,所以将这一个标记为答案-但所有其他答案也都很好。谢谢,很好的解决方案和很好的解释:)。因为有额外的解释,所以将这一个标记为答案-但所有其他答案也都很好。