免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4281 | 回复: 16
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-01-23 09:11 |只看该作者 |倒序浏览
现有一project,急问程序:
表1:
11_1      12_1      13_1      14_1      15_1
21_1      22_1      23_1      24_1      25_1
表2:
11_2      12_2      13_2      14_2      15_2
21_2      22_2      23_2      24_2      25_2
(上面表中各元素不一定为数字)
将两表中所有行比较,找出下列行:
若表1中第x行第1列(即x1)与表2中某(y)行第1列(y1)的平方和,小于与表1中该行(x)第2列(即x2)与表2中那行(y)第2列(即y2)平方和,则将两表中该记录行打印出来。
把所有符合上面的内容都找出来。

awk编程新手,对数组使用不熟,烦请高人指点编程并给出适当说明。

[ 本帖最后由 astronomer 于 2007-1-29 14:43 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-01-23 11:29 |只看该作者
既然不为数字,何来平方和,难道进行类型强制转换?

论坛徽章:
0
3 [报告]
发表于 2007-01-23 11:47 |只看该作者
且认为表格的前两列是数字,不需进行类型强制转换。
我说不一定是数字,是说不需要总结上面给出的表中的数字的规律。我只是随便做了两个表格作例子。

论坛徽章:
0
4 [报告]
发表于 2007-01-23 13:47 |只看该作者
请问两个文件列数是否相同??

论坛徽章:
0
5 [报告]
发表于 2007-01-23 13:56 |只看该作者
如果相同的话可以这样做
paste t1 t2 | awk '{if($1 * $1 + $2 * $2 < $(1+NF / 2) * $(1+NF / 2) + $(2+NF / 2) * $(2+NF / 2) {print $0}}'

论坛徽章:
0
6 [报告]
发表于 2007-01-23 18:03 |只看该作者
两个表格列数不同。
to 侠客:
感谢赐教。
paste t1 t2 | awk '{if($1 * $1 + $2 * $2 < $(1+NF / 2) * $(1+NF / 2) + $(2+NF / 2) * $(2+NF / 2) {print $0}}'
但是上面这个程序不是我要做的。

我想要做的是:把表1中的某一行,到表2种逐行去找,把符合的行对应的两个表中的内容都打印到输出文件的一行。把表1中每一行都一一作这样的比较,最后把两个表中所有符合条件的行都打印出来。

敬请大家帮忙想想办法!
再谢大家!

论坛徽章:
0
7 [报告]
发表于 2007-01-23 19:36 |只看该作者
#!/bin/bash
#filename:compare.sh

while read x;do
        a=`echo "$x" | awk '{print $1}'`
        b=`echo "$x" | awk '{print $2}'`
        while read y;do
                c=`echo "$y" | awk '{print $1}'`
                d=`echo "$y" | awk '{print $2}'`
                if [ $((a * a + b * b)) -lt $((c * c + d * d)) ];then
                        echo "$x $y" >> $3
                fi
        done < $2
done < $1
执行如下
./compare.sh table1 table2 destfile

论坛徽章:
0
8 [报告]
发表于 2007-01-23 19:51 |只看该作者
to Iambitious  :

感谢侠客赐教。
看来shell程序能干这项工作,我先前的想法是写awk脚本,设法实现调用两个表格的功能,这个shell程序真好!
我下来试一下,并好好研读一下这个shell程序。

多多感谢!!!

论坛徽章:
0
9 [报告]
发表于 2007-01-24 10:22 |只看该作者
运行了上面的程序,果然it works very well! thank Iambitious!
看了上面的shell程序。
没有干过shell编程,基本明白了,但是感觉自己还是不能写出来。
对上面的shell命令理解如下,请各位高手指教!


while read x;do                                                             //读第一个文件x
        a=`echo "$x" | awk '{print $1}'`                         //不理解这句。echo命令应该是“显示”
                                                           啊?管道符表示把echo "$x"输出到
                                                           awk '{print $1}吗?实在不理解这句。

        b=`echo "$x" | awk '{print $2}'`
        while read y;do
                c=`echo "$y" | awk '{print $1}'`
                d=`echo "$y" | awk '{print $2}'`
                if [ $((a * a + b * b)) -lt $((c * c + d * d)) ];then             //不理解中间的$在这里
                                                                      是什么意思。另外为什么
                                                                      使用双层括号?
                        echo "$x $y" >> $3
                fi                                                                                     //这两个字符是什么意思啊?
        done < $2
done < $1

[ 本帖最后由 astronomer 于 2007-1-24 10:41 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2007-01-24 10:39 |只看该作者
能不能写一个awk脚本,用awk语言做这项工作。我现在正想多学一点awk有关的知识,对此很感兴趣!

对前人的帖子中如NR〉FNR等关于数组的程序不理解,但很感兴趣。

基本思路是不是调用两个文件中的数据,赋成一个数组,当NF〉FNR时,则数组中的元素应该为第二个文件中的数值,如此即实现了两个文件中的数据的调用。是不是这样啊?

请有兴趣的同志们按照上面的想法,再指点一个awk程序吧!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP