Tendo problemas com este script awk

1

Eu tentei invocar o script abaixo com a linha awk 'filecount' . Ele deve imprimir as informações do arquivo e um número de linha, seguido pelo número total de arquivos no diretório, mas nada acontece.

O que há de errado com esse script?

#!/usr/bin/awk

BEGIN { 
    files=0;
}
{
    files++;
    print files, "\t", $9, "\n", $3, "\n\n";
}
END {
    print "Total Files:  ", files, "\n\n"
}
    
por ThomasLMahoney 14.07.2016 / 18:13

1 resposta

0

Problemas com o script original

Existem alguns problemas com o seu script. Primeiro de tudo, a primeira linha deve ser #!/usr/bin/awk -f . Segundo você disse,

% bl0ck_qu0te%

mas no seu script esta parte conta o número da linha em vez da contagem de arquivos, que também é redundante, porque o AWK tem NR e FNR variáveis que já fazem isso:

{
    files++;
    print files, "\t", $9, "\n", $3, "\n\n";
}

Abordagem de trabalho adequada

Tanto quanto eu entendo, seu principal requisito é imprimir contagem de linha em cada arquivo e imprimir o total de arquivos processados no diretório atual. Isso pode ser feito facilmente com o bash na linha de comando:

$ counter=0; for file in * ; do [ -f "$file" ] && [ -r "$file"  ] &&  { wc -l "$file"; counter=$(($counter+1)); }; done ; echo "Total files:" "$counter"
45 center_active_window.py
41 get_terminal.py
91 typescript
1 xprop.txt
17 xrandr_script.py
Total files: 5

Se você insistir em fazer isso com o awk, também é possível, mas preste atenção - todos os arquivos no diretório devem ser arquivos de texto regulares e legíveis.

Abaixo está o script e sua amostra de execução:

$ cat ~/filecount.awk                                                                                                    
#!/usr/bin/awk -f

FNR==1{

    if (FNR!=NR){
        print counter,last_file;
    }
    filecounter++;
    last_file=ARGV[ARGIND];
    counter=0
};

{counter++};

END{
    print last_file,counter;    
    print "Files processed: ", filecounter;
}

$ ~/filecount.awk *  2> /dev/null                                                                                        
45 center_active_window.py
41 get_terminal.py
91 typescript
1 xprop.txt
xrandr_script.py 17
Files processed:  5

A ideia aqui é simples:

  • sempre que o número da linha no arquivo (a variável FNR ) for 1, gravamos o nome do arquivo usando o array ARGV e a variável ARGIND. Incrementamos o contador de arquivos e definimos o número da linha como 0;

  • se o número do registro não for o mesmo que o número do registro no arquivo atual , isso significa que já processamos pelo menos um arquivo, para que possamos imprimir as informações sobre ele . Isso é o que a parte if (FNR!=NR){ . . . faz

  • Essencialmente, estamos processando o arquivo e, em seguida, analisando suas informações.

  • Depois de passarmos por todos os arquivos, precisamos imprimir informações sobre o último (porque lembre-se de que o script funciona olhando para trás em todos os itens) e, em seguida, imprimir o contador total de arquivos.

por Sergiy Kolodyazhnyy 23.12.2016 / 20:55