2014-12-31 2 views
1

나는에 인수가없는 경우 코드 출력 0의이 작품을 만들기 위해 고군분투 $ (5)얻기 둔한 가능한 경우 인수하지

ls -AFl | sed "1 d" | grep [^/]$ | gawk '{ if ($5 =="") sum = 0; else sum += $5 } END { print sum }' 

내가 모든 파일이없는 디렉토리에이 줄을 실행하면 , 0 대신에 개행 문자를 출력합니다. 이유를 모르겠습니다. 어떻게하면 디렉토리에 파일이 없을 때 0을 출력하도록 만들 수 있습니다. 도움이된다면 고맙겠습니다. 감사합니다.

답변

1

당신이 awk 명령을 변경할 수 있습니다

gawk 'BEGIN { sum = 0 } $5 { sum += $5 } END { print sum }' 

BEGIN 블록에 0sum를 초기화하고 집계 sum$5이 비어 있지 않은 경우에만.

+1

고맙습니다. "sum = 0"섹션 주위에 둥근 괄호가 있어야한다고 생각합니다. 내 버전이 작동하지 않는 이유를 설명해 주시겠습니까? 고맙습니다. –

+0

예, 고삐가 교정되었습니다. '$ 5 == ""'는'$ 5'가 비어있는 필드 6이 필드 5가되기 때문에 작동하지 않습니다. – anubhava

+0

... 이것은 정확하게'ls'을 파싱해서는 안되는 이유입니다! –

0

여기 당신이 원하는 것을 달성의 또 다른 방법 :

stat * 2&>/dev/null | awk '/Size/ && !/directory/ { sum += $2 } END { print (sum ? sum : 0) }' 

stat의 출력을 구문 분석 AWK를 사용합니다. 쉘은 *을 현재 디렉토리의 모든 이름으로 확장합니다. 디렉토리가 비어 있으면 stat이 오류를 생성하고 /dev/null으로 전송됩니다.

awk 스크립트는 "크기"는 포함하지만 "디렉토리"는 포함하지 않는 행에 대해 두 번째 열의 값을 추가하므로 파일과 심볼 링크가 포함됩니다. 파일 수만 계산하려는 경우 !/directory//regular file/으로 변경할 수 있습니다.

이항 연산자 ? :sum이 "참"이면 sum을, 그렇지 않으면 0을 인쇄합니다. 디렉토리가 비어 있으면 sum이 정의되지 않으므로 0이 인쇄됩니다. 주석에서 설명한 바와 같이

는 다수 sum 강요보다 간결한 방법으로 단항 연산자 +print +sum를 사용 print sum+0 또는 대안을 사용하는 것이다. 이 경우, 어느 쪽이든 사용하기에 완벽하게 괜찮습니다. 더 복잡한 시나리오에서는 +sum을 권장합니다.

+0

'print (sum? sum : 0)'은'print sum + 0'에 code-golf 될 수 있습니다. – iruvar

+0

...'+ sum'으로 코드 골프를 치는 것이 가능합니다 :) –