关于将一些命令放在像abc.awk这样的程序文件中的awk初学者问题

时间:2011-03-30 12:42:02

标签: awk

我需要写这个来计算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 :(得分:0)

如果你希望脚本是纯awk,你需要一个带有-f的shebang行。将此行作为文件之一:

#!/usr/bin/awk -f

(或根据您要使用的awk的位置进行调整)

这种方法的一个重大缺点是你必须在脚本中硬编码awk的路径。该问题的典型解决方案(使用/ usr / bin / env)不适用于awk或sed,因为它们需要shebang中的-f。如果您只想在awk周围使用shell脚本包装器,可以执行以下操作:

#!/bin/sh

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

答案 1 :(得分:0)

你可以尝试将这些命令放在一个文件中,例如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那样运行时,您才可以在脚本的第一行输出一个shebang ./myscript.awk,否则,您可以将其删除

答案 2 :(得分:0)

未经测试,但这应该替换所有重复的行:

awk '/^1/ {sum++} NR % 500 == 0 {print sum; sum=0} END {print sum}' 1.txt