免费注册 查看新帖 |

Chinaunix

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

请教高手,看这个shell怎么写? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-20 17:10 |只看该作者 |倒序浏览
原始文件格式是这样的:


20080525|0600|758836152.12
20080525|0602|609000.00
20080525|0603|2666746080.44
20080525|0604|1400500000.00
20080525|0605|380000000.00
20080525|0606|356894829.48

想把上面格式的文件转换为:


   交易日期           0600                  0602           0603           0604                0605                   0606
   20080525     758836152.12    609000.00  2666746080.44   1400500000.00   380000000.00   356894829.48

请问该如何处理?谢谢!!!

[ 本帖最后由 qcgxlg 于 2008-6-20 17:11 编辑 ]

论坛徽章:
1
2015年亚洲杯之巴林
日期:2015-04-02 09:32:18
2 [报告]
发表于 2008-06-20 17:45 |只看该作者

回复 #1 qcgxlg 的帖子

研究中。。。。
如果数据变成这样:
20080525|0600|758836152.12
20080525|0602|609000.00
20080525|0603|2666746080.44
20080525|0604|1400500000.00
20080525|0605|380000000.00
20080525|0606|356894829.48
20080525|0600|758836152.12
20080526|0602|609000.00
20080526|0603|2666746080.44
20080526|0604|1400500000.00
20080526|0605|380000000.00
20080526|0606|356894829.48

考虑结果为:
交易日期           0600                  0602           0603           0604                0605                   0606
20080525     758836152.12    609000.00  2666746080.44   1400500000.00   3800000.00   35689489.48
20080526     758836152.12    609000.00  2666746080.44   1400500000.00   3800000.00   35689489.48

论坛徽章:
0
3 [报告]
发表于 2008-06-20 18:00 |只看该作者

回复 #2 opiopuiopoi 的帖子

谢谢,楼上说的对,有可能是多个交易日期,期待中.......

论坛徽章:
0
4 [报告]
发表于 2008-06-20 18:08 |只看该作者

回复 #1 qcgxlg 的帖子

先顶一下..................

论坛徽章:
0
5 [报告]
发表于 2008-06-20 18:22 |只看该作者
感觉awk可以处理,可惜我awk不行。

论坛徽章:
0
6 [报告]
发表于 2008-06-20 18:26 |只看该作者

回复 #1 qcgxlg 的帖子

这里的高手很多,应该是可以解决的,现实工作中经常遇到这样的问题,谢谢各位大侠的指点,不管用什么办法,能转换就行,感谢!!

论坛徽章:
0
7 [报告]
发表于 2008-06-20 18:31 |只看该作者

回复 #2 opiopuiopoi 的帖子

原始数据是select语句从数据库中得到的,不知道用sql语句是否能够实现这样的输出?

论坛徽章:
0
8 [报告]
发表于 2008-06-20 18:36 |只看该作者
awk -F\| '{a[$1]++;b[$2]=$2;c[$1]=c[$1]"\t"$3;if(a[$1]==1)c[$1]="\n"$1"\t"c[$1]}END{printf "交易日期  ";for(i in b)printf"%s\t\t", i;printf"\n";for(j in c) print  c[j]}'

先撮合的用下吧,应该有更简单的了


[ 本帖最后由 merlin852 于 2008-6-23 08:24 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2008-06-20 18:37 |只看该作者

回复 #8 merlin852 的帖子

谢谢,试一下

论坛徽章:
0
10 [报告]
发表于 2008-06-20 18:44 |只看该作者
楼上的数据有点小问题,其中,第二个0525的0600,应该是0526的:
20080525|0600|758836152.12
20080525|0602|609000.00
20080525|0603|2666746080.44
20080525|0604|1400500000.00
20080525|0605|380000000.00
20080525|0606|356894829.48
20080526|0600|758836152.12
20080526|0602|609000.00
20080526|0603|2666746080.44
20080526|0604|1400500000.00
20080526|0605|380000000.00
20080526|0606|356894829.48


  1. awk -F'|' 'BEGIN { date1="" }  { if ( $1 != date1 ) { if(NR != 1) print x"\n"y; x="date\t\t"$2; y=$1"\t"$3; date1=$1} else { x=x"\t\t"$2; y=y"\t"$3}  } END {print x"\n"y}' 0620.txt
复制代码


结果:
date            0600            0602            0603            0604            0605            0606
20080525        758836152.12    609000.00       2666746080.44   1400500000.00   380000000.00    356894829.48
date            0600            0602            0603            0604            0605            0606
20080526        758836152.12    609000.00       2666746080.44   1400500000.00   380000000.00    356894829.48

或者

  1. awk -F'|' 'BEGIN { date1=""; tf=0 }  { if ( $1 != date1 ) { if(NR != 1) { if(tf==0) {print x; tf=1} print y} x="date\t\t"$2; y=$1"\t"$3; date1=$1} else { x=x"\t\t"$2; y=y"\t"$3}  } END {print y}' 06202.txt
复制代码


结果:
date            0600            0602            0603            0604            0605            0606
20080525        758836152.12    609000.00       2666746080.44   1400500000.00   380000000.00    356894829.48
20080526        758836152.12    609000.00       2666746080.44   1400500000.00   380000000.00    356894829.48

希望对你有帮助。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP