Вопрос начинающего awk о размещении некоторых команд в файле программы, например abc.awk - PullRequest
1 голос
/ 30 марта 2011

Мне нужно написать это для подсчета строк между NR = 0-500, 500-1000, 1000-1500 и т. Д. До конца, которые начинаются с 1.

awk "{NR<=500 && "/^1/" && sum+=1}; END {print sum}"  1.txt
awk "{NR>500 && NR<=1000 && "/^1/" && sum+=1}; END {print sum}"  1.txt
awk "{NR>1000 && NR<=1500 && "/^1/" && sum+=1}; END {print sum}"  1.txt
.....

вот мой вопрос, как я могу поместить их в файл (*. Awk) для одновременной работы ..

Ответы [ 3 ]

0 голосов
/ 30 марта 2011

вы можете попробовать поместить эти команды в файл, например, myscript.awk

NR<=500 && /^1/ { sum1 += 1 }
NR>500 && NR<=1000 && /^1/ { sum2 += 1}
NR>1000 && NR<=1500 && /^1/ { sum3+=1 }
END { print sum1,sum2.sum3 } 

затем запустите в командной строке

awk -f myscript.awk 1.txt

Вам не нужно вызывать awk для одного и того же файла 3 раза! Это пример неэффективного кодирования.

вы можете вывести шебанг #!/usr/bin/awk -f в первой строке вашего скрипта, только если вы хотите запустить его как ./myscript.awk, в противном случае вы можете пропустить его

0 голосов
/ 30 марта 2011

Не проверено, но это должно заменить все эти дублированные строки:

awk '/^1/ {sum++} NR % 500 == 0 {print sum; sum=0} END {print sum}' 1.txt
0 голосов
/ 30 марта 2011

Если вы хотите, чтобы скрипт был чистым awk, вам нужна строка shebang с -f.Сделайте эту строку одним из файлов:

#!/usr/bin/awk -f

(или отрегулируйте в соответствии с местоположением awk, который вы хотите использовать)

Один большой недостаток этого подхода заключается в необходимости жесткого кодапуть awk в сценарии.Типичное решение этой проблемы (использование / usr / bin / env) не работает с awk или sed, потому что они требуют -f в shebang.Если вы просто хотите использовать оболочку сценария оболочки вокруг вашего awk, вы можете сделать что-то вроде:

&#35;!/bin/sh

file=${1-1.txt}
awk "{NR&#60;=500 && "/^1/" && sum+=1}; END {print sum}"  $file
awk "{NR&#62;500 && NR&#60;=1000 && "/^1/" && sum+=1}; END {print sum}"  $file
awk "{NR&#62;1000 && NR&#60;=1500 && "/^1/" && sum+=1}; END {print sum}"  $file

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...