2012-08-01 4 views
1

나는 다음 AWK의 oneliner 있습니다AWK : DICT 값 번호 CONCAT 문자열

내가 무엇이 필요
{dict[$2"@"$6]=($(NF-2)/($(NF-2)+$NF))*100 } END {for (a in dict) { printf "%s %d :" , a, int(dict[a]) }} 

,

($(NF-2)/($(NF-2)+$NF))*100 " out of" $(NF-2)+$NF 

그래서 내가 원하는 각 사전 키 조합의 값에 추가하는 것입니다 awk를 사용하여 모든 수학을 계산 한 다음 문자열을 작성하고 사전 값으로 넣습니다. 나는 이미 공백과 괄호의 조합으로 시도했지만 여전히 운이 없다.

바르는 입력 스트림으로부터 충전된다

$2 - host , not unique in input stream 
$3 - partition , not unique in input stream 
$NF - space avail 
$NF-2 - space used 
$(NF-2)+$NF - gives you overall capacity of partiton 

출력 예상

80% [email protected]/local/1 

출력 :

80% [email protected]/local/1 out of 112G 

가 ------------- --------- Solution -----------------------------------

좋은 잡기와 함께, 나는 이것을 해결했다. 문제는 printf 부분에서 int()를 수행 했으므로 출력이 잘리지 않았다는 것입니다. 하지만, 랩 어라운드 (wrap-around) 셸 부분에서 다른 문제가 발생했기 때문에 최종 코드가 다른 질문과 다를 것으로 예상되었습니다. DICT 값이 내 경우에는 문자열이 될 수 없기 때문에

'{key=($2 "@" $6 " out of " int((($(NF-2)+$NF)/1000)/1000) "GB") ; dict[key]=($(NF-2)/($(NF-2)+$NF))*100 } END {for (a in dict) { printf "%s , %d :" , a, int(dict[a]) }}' 

는 I`ve 내가 INT와 비교됩니다 학습과, 사전 키에 대한 부분 및 용량 "에서"이동했다.

+0

세부 정보를 추가했으나 내 질문의 범위에서 중요성이 낮습니다. 문제는 수학 + 문자열 + 수학의 결과를 (스팅으로서) 연결하여 사전에 배치하는 방법입니다. 나는 awk가 이것에 문제가 있다고 생각하기 시작한다. –

답변

1

연결이 정상적으로 작동합니다. 그것은 문제가 아닙니다.

문제는 인쇄 할 때 사전 값 int()을 계산하고 있다는 것입니다. 값이 문자열이므로 결과가 잘립니다. int()을 사용해야하는 경우 인쇄시보다 계산을 수행 할 때 수행하십시오.

그런데 샘플 데이터를 제공했다면 코드를 테스트하고 대답하는 것이 훨씬 쉬울 것입니다. 이는 문제가 예상했던 곳이 아닌 경우가 종종 있기 때문에 특히 중요합니다.

+0

데니스 감사합니다. 나는 지금 어리 석다. 사실, 나는 printf 부분을 완전히 잊었다. 그리고 그것을 체크하지 않았다. –