awk 명령의 END 블록에서 FOR 루프 사용

awk 명령의 END 블록에서 FOR 루프 사용

하루 평균 파일 개수를 구하려고 합니다.

다음 스크립트가 작동합니다.

#!/bin/sh
ls -l | grep "^-" | awk '{
key=$6$7
freq[key]++
}
END {
for (date in freq)
               printf "%s\t%d\n", date, freq[date]
}'

다음과 같이 for 루프에 do와 done을 추가하면:

#!/bin/sh
ls -l | grep "^-" | awk '{
key=$6$7
freq[key]++
}
END {
for (date in freq)
do
               printf "%s\t%d\n", date, freq[date]
done
}'

다음 오류가 발생합니다.

awk: cmd. line:8: done
awk: cmd. line:8: ^ syntax error

awk 명령의 END 블록 내에 여러 줄의 for 루프 문을 작성하는 방법은 무엇입니까?

해결책:

awk 명령의 END 블록에서 for 루프를 시작하고 종료하려면 { 및 }를 사용해야 합니다.

#!/bin/sh
ls -l | grep "^-" | awk '{
key=$6$7
freq[key]++
}
END {
for (date in freq)
{
        count=count+1
        total=total+freq[date];
        printf "%s\t%d\n", date, freq[date]
}
printf "Average files per day : %d\n",(total/count)
}'

답변1

done같은 구문이 전혀 없습니다 .awkdodo statement while (condition)

중괄호를 사용해야 합니다.

for (date in freq) { cmd1; cmd2; cmd3; }

답변2

일반적으로 ls출력을 구문 분석하는 데 문제가 있다는 점을 고려하십시오.

바라보다ls의 출력을 구문 분석하면 안되는 이유(플러스 링크 페이지).

파일 날짜/시간을 조작하기 위한 솔루션으로 GNU(사용 가능한 경우)를 사용 하고 get find과 같은 GNU 확장을 사용할 수 있습니다.-printf "%T@"UNIX 시대 시간또는 쉽게 분석할 수 있는 형식으로 시간을 출력합니다. (확인 man find하거나여기를 읽어보세요 ).

--편집: Kevin은 다음과 같이 지적했습니다.

BSD find(및 기타 구현)에는 이 기능이 없습니다. 그러나 stat동일한 정보를 얻기 위해 (있는 경우) 사용할 수 있습니다 . 사람들을 확인해 보세요.

--편집 끝

예를 들어 다음과 같이 할 수 있습니다.

find . -maxdepth 1 -type f -printf "%TY%Tm%Td-%TH%TM%TS" 

YYYYMMDD-HHMMSS형식의 수정 시간을 가져옵니다 .

관련 정보