Испытывание Затруднений из-за этого awk сценария

Я попытался вызвать сценарий ниже со строкой awk 'filecount'. Это должно распечатать информацию о файле и номер строки, сопровождаемый общим количеством файлов в каталоге, но ничего не происходит.

Что случилось с этим сценарием?

#!/usr/bin/awk

BEGIN { 
    files=0;
}
{
    files++;
    print files, "\t", $9, "\n", $3, "\n\n";
}
END {
    print "Total Files:  ", files, "\n\n"
}
1
задан 13 November 2017 в 16:18

1 ответ

Проблемами с исходным сценарием

Там являются несколько проблем с Вашим сценарием. В первую очередь, первая строка должна быть #!/usr/bin/awk -f. Второй Вы сказали,

Это должно распечатать информацию о файле и номер строки

, но в Вашем сценарии эта часть считает номер строки вместо количества файла, которое также избыточно, потому что AWK имеет NR и FNR переменные, которые уже делают это:

{
    files++;
    print files, "\t", $9, "\n", $3, "\n\n";
}
<час>

Надлежащий рабочий подход

Насколько я понимаю, Ваше основное требование состоит в том, чтобы распечатать количество строки в каждом файле и печати общие обработанные файлы в текущем каталоге. Это может быть легко сделано с ударом на командной строке:

$ 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

, Если Вы настаиваете на том, чтобы делать это с awk, это возможно также, но обращают внимание - все файлы в каталоге должны быть файлами обычного текста и читаемый.

Ниже сценарий и его выполненный образец:

$ 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

идея здесь проста:

  • каждое число временной шкалы в файле (FNR переменная) равняется 1, мы записываем имя файла с помощью массива ARGV и переменной ARGIND. Мы увеличиваем счетчик файла и устанавливаем номер строки на 0;

  • , если рекордное число не является тем же как рекордным числом в текущем файле , который означает, что мы уже обработали по крайней мере один файл, таким образом, мы можем распечатать информацию об этом. Это - то, что if (FNR!=NR){ . . . часть делает

  • По существу, мы обрабатываем файл и затем смотрим назад на его информацию

  • , После того как мы через все файлы, мы должны распечатать информацию о в последний раз один (потому что помнят, работы сценария путем рассмотрения назад всех объектов), и затем распечатайте общий счетчик файла.

0
ответ дан 28 September 2019 в 23:31

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

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