免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: astronomer
打印 上一主题 下一主题

急问:awk程序,两表格比较。 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-01-24 16:09 |只看该作者
awk 'FILENAME~/1.txt/ {array1[NR]=($1*$1+$2*$2);array2[NR]=$0;next} {if(array1[NR]<($1*$1+$2*$2)) print array2[NR],$0}'  1.txt 2.txt

论坛徽章:
0
12 [报告]
发表于 2007-01-24 16:21 |只看该作者
原帖由 梦蓝 于 2007-1-24 16:09 发表
awk 'FILENAME~/1.txt/ {array1[NR]=($1*$1+$2*$2);array2[NR]=$0;next} {if(array1[NR]<($1*$1+$2*$2)) print array2[NR],$0}'  1.txt 2.txt


不好意思,有个bug,正确如下
awk 'FILENAME~/1.txt/ {a1[NR]=$1*$1+$2*$2;a2[NR]=$0;ALL=NR;next} {if(a1[NR-AL
L]<($1*$1+$2*$2)) print a2[NR-ALL],$0}' 1.txt 2.txt

论坛徽章:
0
13 [报告]
发表于 2007-01-25 12:29 |只看该作者
感谢梦蓝!!!
明白了!
比较两个表格这项工作思路是:
先把第一个表格里的有用信息读到若干个数组中去(即第一个{}的功能),
然后按照第2个{}里的步骤从前到后扫描。
内建变量NR,即读取的记录行数大于第一个表格的行数时即读到了第二个表格。
“if(a1[NR-ALL]<($1*$1+$2*$2)) ”这一句即是把数组a1[NR-ALL]中的每一个元素跟后面的比较。

awk 'FILENAME~/1.txt/                           #指明对1.txt作第一个{}里的操作
       {a1[NR]=$1*$1+$2*$2;                  #为1.txt建立一个数组,把此值读进去。
         a2[NR]=$0;
         ALL=NR;                                         #定义ALL这个变量为1.txt的行数。
         next}
       {if(a1[NR-ALL]<($1*$1+$2*$2)) print a2[NR-ALL],$0}' 1.txt 2.txt [/quote]

还没有运行这个程序,但已经明白了。相信it will work。
多多感谢高手指点!!!

论坛徽章:
0
14 [报告]
发表于 2007-01-29 01:14 |只看该作者
原帖由 梦蓝 于 2007-1-24 16:21 发表


不好意思,有个bug,正确如下
awk 'FILENAME~/1.txt/ {a1[NR]=$1*$1+$2*$2;a2[NR]=$0;ALL=NR;next} {if(a1[NR-AL
L]<($1*$1+$2*$2)) print a2[NR-ALL],$0}' 1.txt 2.txt



发现上面的程序不对:
if语句做的是把第2个表格中的某行的关键域($1和$2)与第一个表格中的第NR-ALL行中的关键域作比较,而没有对表格1中所有的行中的关键域作比较。所以这个程序并不能把两个表格中的所有符合条件的记录都找出来。

再问各位高手!

论坛徽章:
0
15 [报告]
发表于 2007-01-29 08:48 |只看该作者
try
  1. awk '
  2. FILENAME == "a" { square1[NR "," 0] = $1 * $1 + $2 * $2; square1[NR "," 1] = $0; NR1 = NR; }
  3. FILENAME == "b" { square2[NR "," 0] = $1 * $1 + $2 * $2; square2[NR "," 1] = $0; NR2 = NR; }
  4. END {
  5.         min = NR1 > NR2 ? NR2 : NR1;
  6.         for (i = 1; i <= min; i++) if (square1[i] < square2[i]) print square1[i "," 1] "\n" square2[i "," 1];
  7. }' a b
复制代码

论坛徽章:
0
16 [报告]
发表于 2007-01-29 10:06 |只看该作者
原帖由 astronomer 于 2007-1-29 01:14 发表



发现上面的程序不对:
if语句做的是把第2个表格中的某行的关键域($1和$2)与第一个表格中的第NR-ALL行中的关键域作比较,而没有对表格1中所有的行中的关键域作比较。所以这个程序并不能把两个表格中的所有 ...

你用实际数据测试过吗?NR变量是累加的,不是每个文件单独计数的

论坛徽章:
0
17 [报告]
发表于 2007-01-29 14:30 |只看该作者
原帖由 梦蓝 于 2007-1-29 10:06 发表

你用实际数据测试过吗?NR变量是累加的,不是每个文件单独计数的


TO:梦蓝:

用实际的数据测试过了。得到的结果只有一行,正确的结果应该是很多行。
知道变量NR是累加的。FNR是对当前文件的。对吧?:-)

敬请解释一下 梦蓝 给出的程序中这一句:
{if(a1[NR-ALL]<($1*$1+$2*$2)) print a2[NR-ALL],$0}
我觉得问题应该在这里。
a1[NR-ALL]表示什么?[NR—ALL]中的是减号吗?
如果是减号,NR-ALL只表示此一行,也就是第NR行只与第NR-ALL这一行作了比较而没有与1.txt中所有行都比较。如果不是减号,即表示从第NR行到ALL行包括中间所有的行,那起止行是不思弄错了呢?再有,如果我们只想实现[  ]中的运算,让NR和ALL两个变量相减,又该怎么做呢?

可能是我在最初提问的时候说的不清楚,刚刚重新编辑了最初问题的帖子。
即想找出1.txt中任意行x,和2.txt中任意行y中符合平方和条件的所有行。

敬请不吝赐教!在下急切求知。

[ 本帖最后由 astronomer 于 2007-1-29 14:47 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP