Use FOR Loop dentro do bloco END do comando awk

1

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 Lenin Raj Rajasekaran 23.06.2013 / 15:49

2 respostas

3

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; }
    
por 23.06.2013 / 15:57
0

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 .

    
por 23.06.2013 / 17:32

Tags