단위 접미사가있는 숫자에 대한 편리한 구문 분석?


10

의 출력과 같이 사람이 읽을 수있는 형식으로 수량이있는 데이터가 du -h있고 해당 숫자에 대해 추가로 작업하려고 한다고 가정하겠습니다 . grep을 통해 데이터를 파이프하여 해당 데이터의 하위 세트를 합산한다고 가정 해 봅시다. 지금까지 본 적이없는 많은 시스템에서이 임시 작업을 수행하며 최소한의 유틸리티 만 가지고 있습니다. 모든 표준 10 ^ n 접미사에 대한 접미사 변환을 원합니다.

파이프 라인 내에서 접미사 숫자를 실수로 변환하는 gnu-linux 유틸리티가 있습니까? 이 작업을 수행하기 위해 작성된 bash 함수가 있습니까, 아니면 정규식 대체 또는 여러 sed 단계 대신 기억하기 쉬운 펄이 있습니까?

38M     /var/crazyface/courses/200909-90147
2.7M    /var/crazyface/courses/200909-90157
1.1M    /var/crazyface/courses/200909-90159
385M    /var/crazyface/courses/200909-90161
1.3M    /var/crazyface/courses/200909-90169
376M    /var/crazyface/courses/200907-90171
8.0K    /var/crazyface/courses/200907-90173
668K    /var/crazyface/courses/200907-90175
564M    /var/crazyface/courses/200907-90178
4.0K    /var/crazyface/courses/200907-90179

| grep 200907 | <amazing suffix conversion> | awk '{s+=$1} END {print s}'


관련 참조 :


2
grep과 awk를 거의 사용할 필요가 없습니다. awk를 사용하는 경우 awk를 사용하십시오. /200907/라인 당 코드 앞에 추가 하십시오.awk '/200907/{s+=$1} END {print s}'
Tony

답변:


14

귀하가 연결 한 질문 중 하나에 대한 나의 답변을 바탕으로 :

awk '{
    ex = index("KMGTPEZY", substr($1, length($1)))
    val = substr($1, 0, length($1) - 1)

    prod = val * 10^(ex * 3)

    sum += prod
}
END {print sum}'

사용되는 다른 방법 :

sed 's/G/ * 1000 M/;s/M/ * 1000 K/;s/K/ * 1000/; s/$/ +\\/; $a0' | bc

두 번째 방법의 경우 접미사가 s이면 어떻게됩니까?
djuarez

@ djuarez :의 곱셈기는 무엇을 의미합니까?
추후 공지가있을 때까지 일시 중지되었습니다.

다른 단위 사례에 대해서만 추정합니다.
djuarez

@ djuarez : 그건 말이되지 않습니다. 이 대답은 일반적인 단위 (초, 아마도?)가 아닌 SI 접미사에 관한 것입니다. sed내 대답 에서 명령 을 확장하려면 명령에 표시 된 것처럼 추가 SI 접미사를 처리하는 절을 추가합니다 awk. s/T/ * 1000 G;예를 들어 처음에 추가하면 테라 바이트가 추가됩니다.
추후 공지가있을 때까지 일시 중지되었습니다.

3

이를 위해 perl 정규 표현식을 사용할 수 있습니다. 예를 들어

$value = 0;
if($line =~ /(\d+\.?\d*)(\D+)\s+/) {
   $amplifier = 1024 if ($2 eq 'K');
   $amplifier = 1024 * 1024 if ($2 eq 'M');
   $amplifier = 1024 * 1024 * 1024 if ($2 eq 'G');
   $value = $1 * $amplifier;
}

이것은 간단한 스크립트입니다. 시작점으로 생각할 수 있습니다. 그것이 도움이되기를 바랍니다!


실제로 이것은 한 가지 방법입니다. 또한 stackoverflow.com/questions/2557649/… 을 발견했습니다 .
bean

3

개인적으로, 나는 -h 플래그를 처음에는 사용하지 않을 것입니다. "사람이 읽을 수있는"버전은 숫자를 반올림하여 다시 변환 할 때 다시 반올림해야하므로 정확도가 떨어집니다. (예를 들어, 2.7MiB는 2831155.2 바이트입니다. 다른 0.8 바이트로 무엇을 했습니까 ??!)

그렇지 않으면, 당신은 요청할 수 있습니다 units(그렇지 않으면 출력이 탭되어 가정 그냥 "B"에 MiB 크기 / 지브 / 킬로바이트로 변환하고는이 문제를 해결할 수 있습니다,하지만 당신은 뭔가를해야 할 것 cut적절하게)

{your output} | cut -f1 '-d{tab}' | xargs -L 1 -I {} units -1t {}iB B | awk '{s+=$1}END{printf "%d\n",s}'

정밀도 손실이 있음을 잘 알고 있습니다. 단위 입력이 또한 작동 보충 ...하지만 난 발견 units내 최소한의 배포판에 실종! 모든 것을 완전히 통제 할 수 있다면 우리 모두 다르게 할 것이라고 생각합니다.
bean

2
VALUE=$1

for i in "g G m M k K"; do
        VALUE=${VALUE//[gG]/*1024m}
        VALUE=${VALUE//[mM]/*1024k}
        VALUE=${VALUE//[kK]/*1024}
done

[ ${VALUE//\*/} -gt 0 ] && echo VALUE=$((VALUE)) || echo "ERROR: size invalid, pls enter correct size"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.