Я попытался вызвать сценарий ниже со строкой awk 'filecount'
. Это должно распечатать информацию о файле и номер строки, сопровождаемый общим количеством файлов в каталоге, но ничего не происходит.
Что случилось с этим сценарием?
#!/usr/bin/awk
BEGIN {
files=0;
}
{
files++;
print files, "\t", $9, "\n", $3, "\n\n";
}
END {
print "Total Files: ", files, "\n\n"
}
Там являются несколько проблем с Вашим сценарием. В первую очередь, первая строка должна быть #!/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){ . . .
часть делает
По существу, мы обрабатываем файл и затем смотрим назад на его информацию
, После того как мы через все файлы, мы должны распечатать информацию о в последний раз один (потому что помнят, работы сценария путем рассмотрения назад всех объектов), и затем распечатайте общий счетчик файла.