Tentando converter um programa C simples em um programa AWK [closed]

0
Hey guys há algumas semanas atrás eu escrevi um programa C que solicita ao usuário o nome de um arquivo de texto e, em seguida, solicita ao usuário uma palavra. Em seguida, o programa envia o arquivo de texto de entrada com números à esquerda do texto e exibe o número de vezes que a palavra aparece no arquivo de texto. Também mostra os números de linha correspondentes nos quais as palavras estão localizadas.

Aqui está uma amostra dele em ação:

Enter the name of a text file: **bond.txt**
Enter the pattern to search for: Bond
File contents:
1) Secret agent Bond had been warned not to tangle with Goldfinger.
2) But the super-criminal's latest obsession was too strong, too dangerous.
3) He had to be stopped.
4) Goldfinger was determined to take possession of half the supply of
5) mined gold in the world--to rob Fort Knox!
6) For this incredible venture he had enlisted the aid of the top
7) criminals in the U.S.A, including a bevy of beautiful thieves from the
8) Bronx. And it would take all of Bond's unique talents to make it fail--
9) as fail it must.
There is a match on line 1
There is a match on line 8
'Bond' appeared 2 times in the file bond.txt.

Atualmente, estou tentando praticar a programação do awk, repetindo o programa que fiz em C, mas usando o awk.

Aqui está o que eu posso levantar até agora:

BEGIN{
    printf("Enter filename : ")
    getline file < "-"
    while((getline < file)) {
        {print "File Contents:"}
        {printf("%5d) %s\n", NR,$0)}
    }
}

Isso não é de forma alguma completo, mas qual seria a melhor maneira de me permitir analisar o arquivo de texto linha por linha para procurar a palavra digitada pelo usuário. Alguma dica, truques? Obrigado.

    
por T. Blade 18.11.2015 / 17:52

1 resposta

1

Com awk , é muito melhor fornecer o nome do arquivo como argumento da linha de comando, se for algo simples, como procurar por correspondências e quais linhas contêm a correspondência. Em puro awk isso seria algo assim

awk '/searchTerm/ {print "Match on " NR }' inputFile.txt

Mas, com certeza, seu programa pode ser ligeiramente editado e transformado em script AWK para fazer o mesmo trabalho, porém com mais linhas de código. A única pequena peculiaridade é que é preciso pressionar Ctrl + D para parar o loop while, uma vez que o arquivo esteja pronto para leitura.

#!/usr/bin/awk -f 

BEGIN{
    printf("What do we search for:")
    getline searchTerm
    printf("Enter filename : ")
    getline file < "-"
    print "File Contents:"

    while((getline < file)) {       
        x++
        printf("%d) %s\n",x,$0)
        if ($0 ~ searchTerm)  {i++;array[i] = x}
    } 
    #  end while statement
}

END{
    print "There were "i" matches on lines:"
    for (j=1;j<=i;j++) printf array[j]" ";
}

Abaixo, você encontrará a demonstração. Compare o código "traduzido" acima, com o AWK puro:

xieerqi:$ ./testAwk.awk

What do we search for:wlan0
Enter filename : inputFile.txt
File Contents:
1) [33330.084088] wlan0: associate with 00:24:37:10:9c:10 (try 1/3)
2) [33330.086392] wlan0: RX AssocResp from 00:24:37:10:9c:10 (capab=0x411 status=0 aid=1)
3) [33330.086432] wlan0: associated
4) [40272.298739] audit: type=1400 audit(1447859037.270:65): apparmor="STATUS" operation="profile_replace" name="/usr/lib/cups/backend/cups-pdf" pid=4082 comm="apparmor_parser"
5) [40272.298753] audit: type=1400 audit(1447859037.270:66): apparmor="STATUS" operation="profile_replace" name="/usr/sbin/cupsd" pid=4082 comm="apparmor_parser"
6) [40272.299725] audit: type=1400 audit(1447859037.270:67): apparmor="STATUS" operation="profile_replace" name="/usr/sbin/cupsd" pid=4082 comm="apparmor_parser"
7) [59169.780814] atkbd serio0: Unknown key pressed (translated set 2, code 0xa5 on isa0060/serio0).
8) [59169.780823] atkbd serio0: Use 'setkeycodes e025 <keycode>' to make it known.
9) [59169.783874] atkbd serio0: Unknown key released (translated set 2, code 0xa5 on isa0060/serio0).
10) [59169.783882] atkbd serio0: Use 'setkeycodes e025 <keycode>' to make it known.
There were 3 matches on lines:
1 2 3 

xieerqi:$ awk '/wlan0/{print "Match on " NR }' inputFile.txt
Match on 1
Match on 2
Match on 3
    
por Sergiy Kolodyazhnyy 18.11.2015 / 23:00