免费注册 查看新帖 |

Chinaunix

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

关于awk对共同一文本行与行之间操作(请教!) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-04-20 15:05 |只看该作者 |倒序浏览
例:1.txt

200000000000007|十堰市人民路福兴汽配部
202111320000018|市人民医院
202111120000039|黄龙电厂
200000000000007|十堰人民路福兴汽配部
201602520002941|观音中学
202111020000112|喻珍良商店
200000000000007|人民路福兴汽配
201602120000113|包装装璜厂
202111420000024|胡汉江商店
201602320000115|粮油站

请看上面例子,其中$1中证件号码200000000000007这个号码重复了3次,但是$2中的单位名称却不一样。我现在希望做的是:把这些相同证件号码不同单位名称的只保留一个单位名称最长的那一行。连带其他正常的行一起输出。即如下为所求得结果:
200000000000007|十堰市人民路福兴汽配部
202111320000018|市人民医院
202111120000039|黄龙电厂
201602520002941|观音中学
202111020000112|喻珍良商店
201602120000113|包装装璜厂
202111420000024|胡汉江商店
201602320000115|粮油站

请问有什么好的办法能够用程序实现么?当这种情况还在100笔以内时还可以用手工删除,如果是300笔以上,简直太郁闷了。
为什么awk对这种行与行之间的处理我怎么感到有点困难?是不是处理这种类型的需要用数组?请大哥大姐们助我一臂之力,问题是亟待解决,处理思想也请赐教.

[ 本帖最后由 missme 于 2006-4-20 15:06 编辑 ]

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
2 [报告]
发表于 2006-04-20 16:35 |只看该作者
awk 'BEGIN{FS=OFS="|"}
!(length(a[$1])>length($2)){a[$1]=$2}
END{for(i in a)print i,a[i]}' file

论坛徽章:
0
3 [报告]
发表于 2006-04-20 17:04 |只看该作者
太感激了,太强了,一句就搞定了.我得慢慢消化

论坛徽章:
0
4 [报告]
发表于 2006-04-21 10:01 |只看该作者
原帖由 waker 于 2006-4-20 16:35 发表
awk 'BEGIN{FS=OFS="|"}
!(length(a[$1])>length($2)){a[$1]=$2}
END{for(i in a)print i,a}' file

哪位大峡能解释下这段AWK的意思么 ?谢谢!

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
5 [报告]
发表于 2006-04-21 10:26 |只看该作者
新手导航里有基础教程链接,看看十二篇也不错

论坛徽章:
0
6 [报告]
发表于 2006-04-21 23:12 |只看该作者
继续发现问题了.请大师指教.

1.txt
200000000000007|人民路福兴汽配
200000000000007|十堰人民路福兴汽配部
200000000000007|十堰市人民路福兴汽配部
201602120000113|包装装璜厂
201602320000115|粮油站
201602520002941|观音中学
201602520002941|观音中学
202111020000112|喻珍良商店
202111120000039|黄龙电厂
202111320000018|市人民医院
202111320000018|市人民医院
202111420000024|胡汉江商店

2.txt
200000000000007|十堰市人民路福兴汽配部
201602120000113|包装装璜厂
201602320000115|粮油站
201602520002941|观音中学
202111020000112|喻珍良商店
202111120000039|黄龙电厂
202111320000018|市人民医院
202111420000024|胡汉江商店

3.txt
202111420000024|胡汉江商店
200000000000007|十堰市人民路福兴汽配部
200000000000007|十堰市人民路福兴汽配部
201602120000113|包装装璜厂
201602320000115|粮油站
201602520002941|观音中学
201602520002941|观音中学
202111020000112|喻珍良商店
202111120000039|黄龙电厂
202111320000018|市人民医院
202111320000018|市人民医院
202111420000024|胡汉江商店

awk.sh

if [ -f 1.txt ]
then
awk 'BEGIN { OFS=FS="|" } {
                 while ((getline < "2.txt") >0 )
                       { idno[$1] = $1 ; khmc[$1] =$2 }
                }
                {  if ($1 == idno[$7] && $2 != khmc[$7]) {
                        $2 = khmc[$1]
                }
                print $0
        }' 1.txt >3.txt
fi


1.txt,2.txt是源文件,执行awk.sh生成3.txt.其中1.txt因为手工失误有很多$1相同但是$2却不同的,2.txt是标准数据。我希望awk.sh能实现的功能是:把1.txt中的$1相同,$2不同的对照2.txt中的数据换成对应的$2.
但是我发现这个程序虽然大部分实现了,但是有个问题:程序并没有将$1中的第一行200000000000007|人民路福兴汽配  改为 200000000000007|十堰市人民路福兴汽配部  ,即3.txt第一行竟然变成了 202111420000024|胡汉江商店  。而这条记录理论上应该只有一条的,但是在3.txt中却有2条。要是我表达的不清楚的话,我想说我希望awk.sh能生成下面的文件.而上面的awk.sh是在某方面肯定有问题.
4.txt
200000000000007|十堰市人民路福兴汽配部
200000000000007|十堰市人民路福兴汽配部
200000000000007|十堰市人民路福兴汽配部
201602120000113|包装装璜厂
201602320000115|粮油站
201602520002941|观音中学
201602520002941|观音中学
202111020000112|喻珍良商店
202111120000039|黄龙电厂
202111320000018|市人民医院
202111320000018|市人民医院
202111420000024|胡汉江商店

我问了一个工程师,虽然他是我业务上的老大,在C,SQL上是高手,对SHELL也很熟,但是对这个问题还是解决不了,希望老大们帮助解决.

论坛徽章:
0
7 [报告]
发表于 2006-04-22 09:34 |只看该作者
sort 3.txt

论坛徽章:
0
8 [报告]
发表于 2006-04-22 10:44 |只看该作者
原帖由 shitou9000 于 2006-4-22 09:34 发表
sort 3.txt

3.txt是生成的文件,并不是源文件,给他排序没意义

论坛徽章:
0
9 [报告]
发表于 2006-04-22 16:56 |只看该作者

比较好的解决方法

=====输入文件=======
$ cat 1.txt
200000000000007|十堰市人民路福兴汽配部
202111320000018|市人民医院
202111120000039|黄龙电厂
200000000000007|十堰人民路福兴汽配部
201602520002941|观音中学
201602520002941|观音中学(test)
202111020000112|喻珍良商店
200000000000007|人民路福兴汽配
201602120000113|包装装璜厂
202111420000024|胡汉江商店
201602320000115|粮油站

测试结果:
Guest@Vic ~
$ sort -u 1.txt |awk -f tidy.awk
200000000000007|十堰市人民路福兴汽配部
201602120000113|包装装璜厂
201602320000115|粮油站
201602520002941|观音中学(test)
202111020000112|喻珍良商店
202111120000039|黄龙电厂
202111320000018|市人民医院

脚本代码:
$ cat tidy.awk
BEGIN{FS="|"}
{#print old,buf,max,NR
        if (NR==1){
                old=$1;
                buf=$0;
                max=length($2);
        }
        else
        if (old!=$1)
        {
                print buf;
                old=$1;
                max=length($2);
                buf=$0;
        }
        else if (len=length($2)>max)
        {
                max=len;
                buf=$0;
        }
}
END{if (NR==1) print buf}

==================
如果对于其中的语句和算法不明,可以发贴上来.

[ 本帖最后由 vic2005 于 2006-4-22 16:59 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP