Пытаюсь преобразовать простую программу на C в программу AWK [закрыто]

Привет ребята, пару недель назад я написал программу на C, которая запрашивает у пользователя имя текстового файла, а затем запрашивает у пользователя слово. Затем программа выводит входной текстовый файл с числами слева от текста и выводит количество раз, когда слово встречается в текстовом файле. Она также выводит номера строк, в которых находятся слова.

Вот пример его работы:

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.

Сейчас я пытаюсь практиковаться в программировании на awk, повторяя программу, которую я делал на C, но используя awk.

Вот то, что я могу сделать на данный момент:

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

Это далеко не полный вариант, но что может быть лучшим способом, который позволит мне разбирать текстовый файл строка за строкой для поиска слова, введенного пользователем. Какие-нибудь советы, хитрости? Спасибо.

0
задан 18 November 2015 в 21:03

1 ответ

С awk намного лучше обеспечить имя файла как параметр командной строки, если это - что-то простое как поиск соответствий и какие строки содержат соответствие. В чистом awk это было бы чем-то вроде этого

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

Но конечно же, Ваша программа может быть немного отредактирована и превращена сценарий AWK, чтобы сделать то же задание, однако с большим количеством строк кода. Единственная маленькая причуда - то, что нужно нажать Ctrl+D для остановки цикла с условием продолжения, после того как файл сделан, читая.

#!/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]" ";
}

Рев Вы найдете демонстрацию. Сравните "переведенный" код выше с чистым AWK:

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
1
ответ дан 26 July 2019 в 15:22

Другие вопросы по тегам:

Похожие вопросы: