하루 평균 파일 개수를 구하려고 합니다.
다음 스크립트가 작동합니다.
#!/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
같은 구문이 전혀 없습니다 .awk
do
do 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
형식의 수정 시간을 가져옵니다 .