我希望将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