免费注册 查看新帖 |

Chinaunix

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

求awk脚本合并文件 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2011-03-15 10:50 |只看该作者
回复 10# cjaizss


    得到的结果是:
4301|280518.56|325050.0|116171.0|40645.559999999983|150000.0|0.0|
4302|495374.42000000004|249340.0|5990.0|478354.42000000004|175000.0|0.0|
4303|133506.70000000001|197819.17|19576.0|30045.100000000002|
4304|237070.84000000003|203240.0|310695.0|11669.700000000001|0.0|299500.0|
4305|3096857.0|469172.0|70796.0|143136.0|2460205.0|155100.0|27600.0|
4306|2764.3000000000002|57344.0|2200.0|-8735.7000000000007|
4307|1040399.3800000004|48000.0|31650.0|845500.1800000004|28000.0|0.0|
4308|8803.3200000000033|106400.0|91518.0|6663.3200000000024|3000.0|0.0|
4309|39196.599999999999|430800.0|26358.0|4366.5999999999995|
4310|1266023.6899999999|2764000.0|380201.0|445132.68999999989|2000000.0|0.0|721800.0|376701.0|
4311|566650.09999999998|136460.0|81100.0|196969.10000000001|3000.0|0.0|117900.0|62100.0|
4312|672057.73999999999|603000.0|351562.0|88274.089999999982|2000.0|0.0|458944.0|415000.0|324000.0|
4325|520.0|35060.0|18083.0|
4331|721229.40000000002|473762.0|114400.0|-4640.6000000000004|624720.0|246900.0|109100.0|
4393|-3072.1699999999992|58800.0|16228.0|-9151.0499999999993|
和我的本意还是有点点差异,有些为0的数据丢失了

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
12 [报告]
发表于 2011-03-15 10:55 |只看该作者
回复 8# ztj111


   哪个函数运行不了?我看能改下不

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
13 [报告]
发表于 2011-03-15 11:03 |只看该作者
回复  cjaizss


    得到的结果是:
4301|280518.56|325050.0|116171.0|40645.559999999983|150000.0 ...
ztj111 发表于 2011-03-15 10:50



    你的意思是如果那个文件里没有此条记录,就为0?

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
14 [报告]
发表于 2011-03-15 11:12 |只看该作者
本帖最后由 jason680 于 2011-03-15 11:33 编辑
我有6个文件:
1.unl
4301|280518.56|
4302|495374.42000000004|
4303|133506.70000000001|
4304|2370 ...
ztj111 发表于 2011-03-14 12:57



试试Perl...
# cat combine_unl.pl
  1. #!/usr/bin/env perl
  2. use strict;
  3. use warnings;

  4. my @gaData;
  5. my @gaItem;
  6. my %ghId;

  7. foreach my $sFn (1..6){
  8.   my $sFile = "$sFn.unl";
  9.   open(my $FHunl, "< $sFile") or die "can't open the $sFile\n";
  10.   while(<$FHunl>){
  11.     chomp;
  12.     my ($sId, @aNum) = split(/\|/,$_);
  13.     if($sId){
  14.       $ghId{$sId} = 1;
  15.       $gaData[$sFn]->{$sId} = \@aNum;
  16.       $gaItem[$sFn] = scalar @aNum;
  17.     }
  18.   }
  19.   close $FHunl;
  20. }
  21. foreach my $sId(sort{$a<=>$b} keys %ghId){
  22.   print "$sId|";
  23.   foreach my $sFn(1..6){
  24.     if(exists $gaData[$sFn]->{$sId}){
  25.       foreach(@{$gaData[$sFn]->{$sId}}){
  26.         $_=sprintf("%.2f",$_) if(m/\.\d{3}/);
  27.         s/\.00?$|0$//;
  28.         print "$_|";
  29.       }
  30.     }
  31.     else{
  32.       print "0|" x $gaItem[$sFn];
  33.     }
  34.   }
  35.   print "\n";
  36. }
复制代码
# perl combine_unl.pl
4301|280518.56|325050|116171|40645.56|150000|0|0|0|0|
4302|495374.42|249340|5990|478354.42|175000|0|0|0|0|
4303|133506.7|197819.17|19576|30045.1|0|0|0|0|0|
4304|237070.84|203240|310695|11669.7|0|0|0|0|299500|
4305|3096857|469172|70796|143136|0|0|2460205|155100|27600|
4306|2764.3|57344|2200|-8735.7|0|0|0|0|0|
4307|1040399.38|48000|31650|845500.18|28000|0|0|0|0|
4308|8803.32|106400|91518|6663.32|3000|0|0|0|0|
4309|39196.6|430800|26358|4366.6|0|0|0|0|0|
4310|1266023.69|2764000|380201|445132.69|2000000|0|0|721800|376701|
4311|566650.1|136460|81100|196969.1|3000|0|0|117900|62100|
4312|672057.74|603000|351562|88274.09|2000|0|458944|415000|324000|
4325|520|35060|18083|0|0|0|0|0|0|
4331|721229.4|473762|114400|-4640.6|0|0|624720|246900|109100|
4393|-3072.17|58800|16228|-9151.05|0|0|0|0|0|

论坛徽章:
0
15 [报告]
发表于 2011-03-15 18:04 |只看该作者
  1. #! /usr/bin/awk -f

  2. BEGIN{
  3.         FS="|";
  4.         OFS="|"
  5. }

  6. {
  7.         for(i=2;i<NF;i++)
  8.                 a[$1]=a[$1] $i "|";
  9. }

  10. END{
  11.         for (i in a) print i "|"  a[i];
  12. }

复制代码
如果需要的话可以将使用管道输出到 sort -t"|"

论坛徽章:
0
16 [报告]
发表于 2011-03-15 18:12 |只看该作者
吧结果注释下,看看...

论坛徽章:
0
17 [报告]
发表于 2011-03-16 12:41 |只看该作者
回复 13# cjaizss


    对的

论坛徽章:
0
18 [报告]
发表于 2011-03-16 12:42 |只看该作者
回复 12# yinyuemi


    gensub这个函数在AIX的awk中好像不支持

论坛徽章:
0
19 [报告]
发表于 2011-03-16 12:46 |只看该作者
回复 15# ymll


    这个得到的结果是:
4301|280518.56|325050.0|116171.0|40645.559999999983|150000.0|0.0|
4302|495374.42000000004|249340.0|5990.0|478354.42000000004|175000.0|0.0|
4303|133506.70000000001|197819.17|19576.0|30045.100000000002|
4304|237070.84000000003|203240.0|310695.0|11669.700000000001|0.0|299500.0|
4305|3096857.0|469172.0|70796.0|143136.0|2460205.0|155100.0|27600.0|
4306|2764.3000000000002|57344.0|2200.0|-8735.7000000000007|
4307|1040399.3800000004|48000.0|31650.0|845500.1800000004|28000.0|0.0|
4308|8803.3200000000033|106400.0|91518.0|6663.3200000000024|3000.0|0.0|
4309|39196.599999999999|430800.0|26358.0|4366.5999999999995|
4310|1266023.6899999999|2764000.0|380201.0|445132.68999999989|2000000.0|0.0|721800.0|376701.0|
4311|566650.09999999998|136460.0|81100.0|196969.10000000001|3000.0|0.0|117900.0|62100.0|
4312|672057.73999999999|603000.0|351562.0|88274.089999999982|2000.0|0.0|458944.0|415000.0|324000.0|
4325|520.0|35060.0|18083.0|
4331|721229.40000000002|473762.0|114400.0|-4640.6000000000004|624720.0|246900.0|109100.0|
4393|-3072.1699999999992|58800.0|16228.0|-9151.0499999999993|
和我本意也有点差异

论坛徽章:
0
20 [报告]
发表于 2011-03-16 12:47 |只看该作者
没有需要补0
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP