LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 942|回复: 7

问个awk的循环问题

[复制链接]
发表于 2011-11-14 17:30:25 | 显示全部楼层 |阅读模式
shell代码:

    awk -v max_records=50 '
        BEGIN { FS="|" }
        {
            i=0;
            while (i < max_records)
                {
                    if(($1 >= 10) && ($2 <= 20))
                        {
                            i++;
                            print NR,$1,$2;
                        }
                }
        }
        END {}' \
        test.txt

编程目的:text文件的域分割符为“|”,在其中查找第1域值大于10且第2域值小于20的行,只需要找到满足条件的前50行并将其打印出来即可,后面的都忽略

由于文件非常巨大,满足条件的行有几万行,考虑到脚本的执行效率问题,设置了一个变量max_records,只需要awk程序查找满足条件的前max_records行即退出,不需要查找后面的行了。

运行以上程序,死循环,只有Ctrl + C退出。请各位高手分析下症结所在。如果要实现上面的目的,请问该怎么写代码
发表于 2011-11-15 12:55:09 | 显示全部楼层
这个需求不用写while循环,只用if就够用了。
AWK里有exit“命令”。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-11-15 16:40:38 | 显示全部楼层
Post by tomgrean;2155097
这个需求不用写while循环,只用if就够用了。
AWK里有exit“命令”。


那么应该怎么写?

尝试如下代码:

awk -v max_records=50 '
BEGIN { FS="|" }
{
  i=0;
  if((i < max_records) && ($1 >= 10) && ($2 <= 20))
     {
        i++;
        print NR,$1,$2;
     }
  else
    {
       exit;
    }
}
END {}' \
test.txt

试过了,不行的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-11-15 17:05:45 | 显示全部楼层
实验了半天,终于找到解决方法了,原来要把i=0放在BEGIN字段里面,而且要用if...else的判断结构,不是用循环

awk -v max_records=50 '
BEGIN { FS="|"; i=0}
{
  if((i < max_records)
     {
        if($1 >= 10) && ($2 <= 20))
          {
             i++;
             print NR,$1,$2;
          }
     }
  else
    {
       exit;
    }
}
END {}' \
test.txt
回复 支持 反对

使用道具 举报

发表于 2011-11-19 11:13:53 | 显示全部楼层
看不出你需要用i的地方,直接用NR判断不好么

...
NR > max_records {exit;}
越早exit越好.
回复 支持 反对

使用道具 举报

发表于 2011-11-19 11:29:49 | 显示全部楼层
我很费解你这个脚本是怎么运行成功的;

awk -F'|' '$1>10 && $2<20{if(c==2)exit;print;c++}' file
回复 支持 反对

使用道具 举报

发表于 2011-11-19 11:33:11 | 显示全部楼层
楼主是要符合输出条件的50行,不是只判断前50行。
回复 支持 反对

使用道具 举报

发表于 2011-12-9 23:02:43 | 显示全部楼层
Post by zooyo;2155448
我很费解你这个脚本是怎么运行成功的;

awk -F'|' '$1>10 && $2<20{if(c==2)exit;print;c++}' file



我比较赞同这种写法,楼主的看半天感觉太费劲了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表