除特定字段中的数字

除特定字段中的数字

我希望将PERCENT=""数据中字段内的数字除以START_LV=""END_LV=""。但是我想将数字除以 5数字必须是整数。另外,如果当前数量低于 5,则应将其设置为PERCENT="1"

样本数据为:

<VALUE MON_ID="30016" START_LV="1" END_LV="99" PERCENT="333" ITEM_ID="992" AMOUNT="1" GROUPING="1" DROPSET="0" ZONELEVEL="GSP" VER="200" /><VALUE MON_ID="30016" START_LV="1" END_LV="99" PERCENT="626" ITEM_ID="993" AMOUNT="1" GROUPING="1" DROPSET="0" ZONELEVEL="GSP" VER="200" /><VALUE MON_ID="30016" START_LV="1" END_LV="99" PERCENT="555" ITEM_ID="994" AMOUNT="1" GROUPING="1" DROPSET="0" ZONELEVEL="GSP" VER="200" /><VALUE MON_ID="30016" START_LV="1" END_LV="99" PERCENT="1" ITEM_ID="995" AMOUNT="1" GROUPING="1" DROPSET="0" ZONELEVEL="GSP" VER="200" /><VALUE MON_ID="30016" START_LV="1" END_LV="99" PERCENT="4" ITEM_ID="996" AMOUNT="1" GROUPING="1" DROPSET="0" ZONELEVEL="GSP" VER="200" /><VALUE MON_ID="30016" START_LV="1" END_LV="99" PERCENT="5" ITEM_ID="997" AMOUNT="1" GROUPING="1" DROPSET="0" ZONELEVEL="GSP" VER="200" /><VALUE MON_ID="30016" START_LV="1" END_LV="99" PERCENT="300" ITEM_ID="998" AMOUNT="1" GROUPING="1" DROPSET="0" ZONELEVEL="GSP" VER="200" /><VALUE MON_ID="30016" START_LV="1" END_LV="99" PERCENT="350" ITEM_ID="1025" AMOUNT="1" GROUPING="1" DROPSET="0" ZONELEVEL="GSP" VER="200" />

应改为:

<VALUE MON_ID="30016" START_LV="1" END_LV="99" PERCENT="66" ITEM_ID="992" AMOUNT="1" GROUPING="1" DROPSET="0" ZONELEVEL="GSP" VER="200" /><VALUE MON_ID="30016" START_LV="1" END_LV="99" PERCENT="125" ITEM_ID="993" AMOUNT="1" GROUPING="1" DROPSET="0" ZONELEVEL="GSP" VER="200" /><VALUE MON_ID="30016" START_LV="1" END_LV="99" PERCENT="111" ITEM_ID="994" AMOUNT="1" GROUPING="1" DROPSET="0" ZONELEVEL="GSP" VER="200" /><VALUE MON_ID="30016" START_LV="1" END_LV="99" PERCENT="1" ITEM_ID="995" AMOUNT="1" GROUPING="1" DROPSET="0" ZONELEVEL="GSP" VER="200" /><VALUE MON_ID="30016" START_LV="1" END_LV="99" PERCENT="1" ITEM_ID="996" AMOUNT="1" GROUPING="1" DROPSET="0" ZONELEVEL="GSP" VER="200" /><VALUE MON_ID="30016" START_LV="1" END_LV="99" PERCENT="1" ITEM_ID="997" AMOUNT="1" GROUPING="1" DROPSET="0" ZONELEVEL="GSP" VER="200" /><VALUE MON_ID="30016" START_LV="1" END_LV="99" PERCENT="60" ITEM_ID="998" AMOUNT="1" GROUPING="1" DROPSET="0" ZONELEVEL="GSP" VER="200" /><VALUE MON_ID="30016" START_LV="1" END_LV="99" PERCENT="70" ITEM_ID="1025" AMOUNT="1" GROUPING="1" DROPSET="0" ZONELEVEL="GSP" VER="200" />

数据不以行分隔。此外,具有小数位的数字可以向上或向下舍入,只要它们是整数就没有关系。

答案1

假设该文件是格式良好的 XML 文件,您可以使用它xmlstarlet来更新属性值:

xmlstrlet ed -u '//VALUE/@PERCENT' -x 'ceiling(. div 5)' file.xml

这将从中读取 XMLfile.xml并将VALUE节点的PERCENT属性值除以 5,将结果向上舍入。生成的 XML 文档将写入标准输出,因此您只需将其重定向到新文档即可。

您还可以向下舍入,然后更正任何变成零的数字:

xmlstarlet ed -u '//VALUE/@PERCENT'        -x 'floor(. div 5)' \
              -u '//VALUE/@PERCENT[. = 0]' -v 1 file.xml

或者,只除大于或等于 5 的数字,并将较小的数字设置为 1:

xmlstarlet ed -u '//VALUE/@PERCENT[. <  5]' -v 1 \
              -u '//VALUE/@PERCENT[. >= 5]' -x 'floor(. div 5)' file.xml

请注意此处的操作顺序:我们不想将值设置为 1,只是因为将它们除以 5 会使它们变小。

答案2

tr -s " " "\n" < data | while read -r a;do if [ ${a:0:7} = "PERCENT" ];then echo -n PERCENT=\"$((${a//[A-Z=\"]} / 5 ))\"\  ; else echo -n $a" ";fi;done

相关内容