Não há nenhuma sintaxe done
em awk
e do
como do statement while (condition)
.
Você precisa de chaves em vez disso:
for (date in freq) { cmd1; cmd2; cmd3; }
Estou tentando encontrar o número médio de arquivos por dia.
O script a seguir funciona:
#!/bin/sh
ls -l | grep "^-" | awk '{
key=$6$7
freq[key]++
}
END {
for (date in freq)
printf "%s\t%d\n", date, freq[date]
}'
Quando eu adiciono fazer e pronto para o loop for como abaixo:
#!/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
}'
Eu recebo o erro abaixo:
awk: cmd. line:8: done
awk: cmd. line:8: ^ syntax error
Como escrever várias linhas para instruções de loop dentro do bloco END do comando awk?
Solução:
Precisamos usar {e} para iniciar e terminar o loop no bloco END do comando awk.
#!/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)
}'
Por favor considere que, em geral, analisar ls
output é problemático.
Veja Por que você não deve analisar a saída de ls (além de páginas vinculadas).
Como uma solução para manipular a data / hora dos arquivos, você pode usar o GNU find
(onde disponível) e usar o GNU extesion como -printf "%T@"
para obter tempo da época do unix ou tempo de saída no formato fácil de ser analisado. (confira man find
ou leia aqui
).
- EDIT: Kevin ressalte isto:
O BSD find
(e outras implementações) não tem essa funcionalidade. Mas é possível usar stat
(onde presente) para obter as mesmas informações. Verifique o homem.
- EDIT END
Como exemplo você pode fazer samething assim:
find . -maxdepth 1 -type f -printf "%TY%Tm%Td-%TH%TM%TS"
para obter tempos de modificação no formato YYYYMMDD-HHMMSS
.
Tags awk