특정 필드의 숫자 제외

특정 필드의 숫자 제외

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

그러면 XML을 읽고 file.xml노드 VALUEPERCENT속성 값을 5로 나누어 결과를 반올림합니다. 생성된 XML 문서는 표준 출력으로 작성되므로 간단히 새 문서로 리디렉션할 수 있습니다.

반올림한 후 0이 되는 숫자를 수정할 수도 있습니다.

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

여기서 작업 순서에 유의하세요. 값을 5로 나누면 값이 작아지기 때문에 값을 1로 설정하고 싶지 않습니다.

답변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

관련 정보