免费注册 查看新帖 |

Chinaunix

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

请各位大虾帮助一个菜鸟级问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-02-10 12:19 |只看该作者 |倒序浏览
本帖最后由 lbbei 于 2012-03-07 10:34 编辑

万分感谢 二楼 yangkyo821 在线热心的帮助。程序已通,所有问题全部解决。可能部分细节上还些小问题,待我慢慢修改。
再次感谢 三楼 jiejie455,你的程序居然结果也是对的,因为你没听明白我说的问题。
         一楼 ywlscpl,你的命令可以分隔。
谢谢各位!!!


* 2007 10 14 01 05 39.400  37.68330   76.10000 105.000  4.5   
040.34280_0081.13390_1014.000  a  4.735   237.493              
036.79640_0079.96280_1676.000  a  3.207   287.181              
* 2007 10 20 11 25 33.200  43.50000   83.80000  32.000  3.7   
039.92170_0080.97500_1064.000  b  4.154    29.680              
039.04310_0080.96110_1127.000  b  4.940    24.744              
038.49920_0080.98640_1163.000  a  5.430    22.177              
* 2007 10 22 00 13 37.000  35.11670   78.06670   0.000  4.5   
037.66390_0080.37640_1243.000  c  3.152   216.934              
038.16690_0080.68780_1193.000  c  3.703   215.489              


有上面这样一个文件,分隔符是“*”,现在需要每段生成一个新文件。新文件名就是*行的前4个字符串,新文件第一行是每段“*”下面的行数,第二行是*行的后三个字符串,第三行是*行下面行中的第二个字符串,第四行开始就是*行下面的行。如:

其中一个新文件文件名:200710140105
其中一个新文件内容为:  
2
76.10000 105.000  4.5
a
40.3428    81.13390  -1014(本列数值求反)   -0.764
036.7964  79.9628    -1676 (本列数值求反)  0.764此列是本列平均数减去当前列后的值


程序比较复杂,如果大虾们没有时间可以先告诉我怎么把上面的文件以 * 为分隔符划分成N个小文档。
另外  列值为:a,b,c的列,如果本列有两个或以上的值,则本段就要新生成两个或以上的文件。文件名以 “.a”".b"等区别。

倒转文本:  sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//' 新建空文

论坛徽章:
0
2 [报告]
发表于 2012-02-10 12:59 |只看该作者
本帖最后由 ywlscpl 于 2012-02-10 13:01 编辑

回复 1# lbbei


    其他看不懂
大虾们没有时间可以先告诉我怎么把上面的文件以 * 为分隔符划分成N个小文档。
  1. awk -v RS='*' 'NR-1{print >$1 $2 $3 $4 $5}' file
复制代码

论坛徽章:
0
3 [报告]
发表于 2012-02-10 14:13 |只看该作者
本帖最后由 yangkyo821 于 2012-02-10 16:22 编辑
  1. #!/bin/awk -f
  2. BEGIN{
  3.     FS="_| +"
  4. }
  5. /^\*/{
  6.     if(l1)output()
  7.     outfile=$2$3$4$5$6
  8.     l1=0
  9.     l2=$9OFS$10OFS$11
  10.     sum5=0
  11.     num5=0
  12.     val4=""
  13.     next
  14. }
  15. {
  16.     l1++
  17.     $3="-"$3
  18.     if(val4 == "" || val4 == $4){
  19.         val4=$4
  20.         sum5+=$5
  21.         num5++
  22.     }
  23.     else{
  24.         output()
  25.         num5=1
  26.         val4=$4
  27.         sum5=$5
  28.     }
  29.     val5[num5]=$5
  30.     val1[num5]=$1
  31.     val2[num5]=$2
  32.     val3[num5]=$3
  33. }
  34. END{output()}

  35. function output(){
  36.     average=sum5/num5
  37.     ofname=outfile"."val4
  38.     printf "%s"ORS"%s"ORS"%s"ORS, l1, l2, val4 > ofname
  39.     for(i=1;i<=num5;i++){
  40.         subval=average-val5[i]
  41.         printf "%g\t%g\t%g\t%g"ORS, val1[i], val2[i], val3[i], subval >> ofname
  42.         close(ofname)
  43.     }
  44. }
复制代码

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
4 [报告]
发表于 2012-02-10 14:22 |只看该作者
楼主听谁说的这是菜鸟级问题?

论坛徽章:
0
5 [报告]
发表于 2012-02-10 14:47 |只看该作者
本帖最后由 jiejie455 于 2012-02-10 14:55 编辑

036.7964  79.9628    -1676 (本列数值求反)  0.764此列是本列平均数减去当前列后的值 这个没看明白。
卜一挂,楼主凑合着试试看吧。
  1. #!/usr/bin/awk -f
  2. BEGIN{
  3.         FS="[ \_]\+"
  4. }
  5. {
  6.         if($0~/^*/){
  7.                 if(NR!=1){
  8.                         for(i in a){
  9.                                 temp=a[i]
  10.                                 temp=gsub("\n","_",temp)+1
  11.                                 str=temp"\n"line2"\n"i"\n"a[i]
  12.                                 print str > filename"."i
  13.                         }
  14.                 }

  15.                 delete a
  16.                 filename=$2$3$4$5$6;
  17.                 line2=$9" "$10" "$11;
  18.         }else{
  19.                 if(a[$4]){
  20.                         a[$4]=a[$4]"\n"$1" "$2" -"$3;
  21.                 }else{
  22.                         a[$4]=$1" "$2" -"$3;
  23.                 }
  24.         }
  25. }
  26. END{
  27.                         for(i in a){
  28.                                 temp=a[i]
  29.                                 temp=gsub("\n","_",temp)+1
  30.                                 str=temp"\n"line2"\n"i"\n"a[i]
  31.                                 print str > filename"."i
  32.                         }
  33. }

复制代码

论坛徽章:
0
6 [报告]
发表于 2012-02-10 15:32 |只看该作者
本帖最后由 lbbei 于 2012-02-10 15:38 编辑

万分感谢各位的帮助,待我试试能不能走得通。

Shell_HAT 发表于 2012-02-10 14:22
楼主听谁说的这是菜鸟级问题?

我连那个把文件分段分出来都搞不好还不是菜鸟吗。。。

论坛徽章:
0
7 [报告]
发表于 2012-02-10 15:37 |只看该作者
先谢谢这位朋友的热心
jiejie455 发表于 2012-02-10 14:47
036.7964  79.9628    -1676 (本列数值求反)  0.764此列是本列平均数减去当前列后的值 这个没看明白。
卜 ...


此列是本列平均数减去当前列后的值    的意思是:分隔成小文件后 a列 后面的那一列先求平均数,再用平均数减去每一行该列的值所得的结果。

可能是我没说明白吧。

论坛徽章:
0
8 [报告]
发表于 2012-02-10 15:59 |只看该作者
本帖最后由 yangkyo821 于 2012-02-10 16:23 编辑

回复 7# lbbei


    楼主啊,俺的代码满足你么?
。。。俺代码最后掉了一个花括号, ,可怜的楼主没看出来

论坛徽章:
0
9 [报告]
发表于 2012-02-10 16:22 |只看该作者
回复 8# yangkyo821

    你好,万分感谢你的热心帮忙。
我正在看你的程序,因为我对awk编程不是很懂,你的程序里面有些地方看不懂,怎么运行程序呀?不用给定输入文件吗?

bash脚本的时候出现:
3: line 2: BEGIN{: command not found
3: line 4: syntax error near unexpected token `}'
3: line 4: `}'.

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
10 [报告]
发表于 2012-02-10 16:23 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP