免费注册 查看新帖 |

Chinaunix

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

[文本处理] 关于文本处理问题,菜鸟求助各位大神,谢谢! [复制链接]

论坛徽章:
3
2015亚冠之布里斯班狮吼
日期:2015-06-25 18:46:20程序设计版块每日发帖之星
日期:2015-09-17 06:20:0015-16赛季CBA联赛之江苏
日期:2017-01-09 21:37:58
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-09-12 11:19 |只看该作者 |倒序浏览
本帖最后由 tengfei0311 于 2015-09-12 14:35 编辑

从第13行开始,对第1列的2.0000进行相加,一直加到倒数第二行止,如果值等于150,就不管这个文件;如果值不等于150,就把最后一行2.0000改成5.0000,后面的值不变,把改后的5.0000这一行所有值复制在文件后面,复制到和为150止。

说明:我的所有文件第一列值相加都不会超过150,一般在100以内。

测试数据见附件:
11.zip (381 Bytes, 下载次数: 9)


##########################################################
#############文件名:test.mod##################################
MODEL.01                                                               
Crust1.0                                                               
ISOTROPIC                                                               
KGS                                                                     
SPHERICAL EARTH                                                         
1-D                                                                     
CONSTANT VELOCITY                                                      
LINE08                                                                  
LINE09                                                                  
LINE10                                                                  
LINE11                                                                  
H(KM)   VP(KM/S) VS(KM/S) RHO(GM/CC)   QP   QS  ETAP  ETAS  FREFP  FREFS
2.0000 6.100 3.550 2.740 849.  600.  0.00  0.00  1.00  1.00     ###(第13行)###
2.0000 6.100 3.550 2.740 849.  600.  0.00  0.00  1.00  1.00
2.0000 6.100 3.550 2.740 849.  600.  0.00  0.00  1.00  1.00
2.0000 6.100 3.550 2.740 849.  600.  0.00  0.00  1.00  1.00
2.0000 6.100 3.550 2.740 849.  600.  0.00  0.00  1.00  1.00
2.0000 6.100 3.550 2.740 849.  600.  0.00  0.00  1.00  1.00
2.0000 6.100 3.550 2.740 849.  600.  0.00  0.00  1.00  1.00
2.0000 6.100 3.550 2.740 849.  600.  0.00  0.00  1.00  1.00
2.0000 6.300 3.650 2.780 849.  600.  0.00  0.00  1.00  1.00
2.0000 6.300 3.650 2.780 849.  600.  0.00  0.00  1.00  1.00
2.0000 6.300 3.650 2.780 849.  600.  0.00  0.00  1.00  1.00
2.0000 6.300 3.650 2.780 849.  600.  0.00  0.00  1.00  1.00
2.0000 6.300 3.650 2.780 849.  600.  0.00  0.00  1.00  1.00
2.0000 6.300 3.650 2.780 849.  600.  0.00  0.00  1.00  1.00
2.0000 6.300 3.650 2.780 849.  600.  0.00  0.00  1.00  1.00
2.0000 6.300 3.650 2.780 849.  600.  0.00  0.00  1.00  1.00
2.0000 6.300 3.650 2.780 849.  600.  0.00  0.00  1.00  1.00
2.0000 6.300 3.650 2.780 849.  600.  0.00  0.00  1.00  1.00
2.0000 6.300 3.650 2.780 849.  600.  0.00  0.00  1.00  1.00
2.0000 6.300 3.650 2.780 849.  600.  0.00  0.00  1.00  1.00
2.0000 6.300 3.650 2.780 849.  600.  0.00  0.00  1.00  1.00
2.0000 6.300 3.650 2.780 849.  600.  0.00  0.00  1.00  1.00
2.0000 6.300 3.650 2.780 849.  600.  0.00  0.00  1.00  1.00
2.0000 6.300 3.650 2.780 849.  600.  0.00  0.00  1.00  1.00
2.0000 7.000 3.990 2.950 849.  600.  0.00  0.00  1.00  1.00
2.0000 7.000 3.990 2.950 849.  600.  0.00  0.00  1.00  1.00
2.0000 7.000 3.990 2.950 849.  600.  0.00  0.00  1.00  1.00
2.0000 7.000 3.990 2.950 849.  600.  0.00  0.00  1.00  1.00
2.0000 7.000 3.990 2.950 849.  600.  0.00  0.00  1.00  1.00
2.0000 7.000 3.990 2.950 849.  600.  0.00  0.00  1.00  1.00
2.0000 7.000 3.990 2.950 849.  600.  0.00  0.00  1.00  1.00
2.0000 7.000 3.990 2.950 849.  600.  0.00  0.00  1.00  1.00
2.0000 7.000 3.990 2.950 849.  600.  0.00  0.00  1.00  1.00
2.0000 7.000 3.990 2.950 849.  600.  0.00  0.00  1.00  1.00
2.0000 7.000 3.990 2.950 849.  600.  0.00  0.00  1.00  1.00
2.0000 7.000 3.990 2.950 849.  600.  0.00  0.00  1.00  1.00
2.0000 7.000 3.990 2.950 849.  600.  0.00  0.00  1.00  1.00
2.0000 7.000 3.990 2.950 849.  600.  0.00  0.00  1.00  1.00
2.0000 7.000 3.990 2.950 849.  600.  0.00  0.00  1.00  1.00
2.0000 7.000 3.990 2.950 849.  600.  0.00  0.00  1.00  1.00
2.0000 7.000 3.990 2.950 849.  600.  0.00  0.00  1.00  1.00
2.0000 7.000 3.990 2.950 849.  600.  0.00  0.00  1.00  1.00
2.0000 7.000 3.990 2.950 849.  600.  0.00  0.00  1.00  1.00   #####累加到这一行止######
2.0000  8.120 4.510 849.  600.  0.00  0.00  1.00  1.00         ————》第一列值累加达不到150,就要把这行改成:5.0000  8.120 4.510 849.  600.  0.00  0.00  1.00  1.00 之后复制到第一列和为150止

#######################################################


以上面这个文件为实例:

对第1列值,从13行起累加到倒数第二行,一共43行,那么值加起来86,不够和为150;差150-86=64 那么就要把最后一行:
2.0000  8.120 4.510 849.  600.  0.00  0.00  1.00  1.00
改成:
5.0000  8.120 4.510 849.  600.  0.00  0.00  1.00  1.00   (第一列2.0000改成5.0000就行)

差64 就把改后的最后一行:5.0000  8.120 4.510 849.  600.  0.00  0.00  1.00  1.00(复制13行)  一共要复制13行放后面 结束!!!


我这里有300多个这样的文件,每个文件行数都不一样。


谢谢!!!!!!!!!!




论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2015-09-12 14:21 |只看该作者
tengfei0311 发表于 2015-09-12 11:19
第一列值累加达不到150,就要把这行改成:5.0000  8.120 4.510 849.  600.  0.00  0.00  1.00  1.00 之后复制到第一列和为150止


如果超过了 150 呢?

论坛徽章:
3
2015亚冠之布里斯班狮吼
日期:2015-06-25 18:46:20程序设计版块每日发帖之星
日期:2015-09-17 06:20:0015-16赛季CBA联赛之江苏
日期:2017-01-09 21:37:58
3 [报告]
发表于 2015-09-12 14:32 |只看该作者
回复 2# MMMIX

不会超过150  每个文件第一列的值加起来不会超过100的

   

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
4 [报告]
发表于 2015-09-12 14:55 |只看该作者
回复 3# tengfei0311


    那超过150就不做处理了:

#!/usr/bin/awk -f

{
    if (NR < 13) {
        print
    } else {
        total += p1
        p1 = $1

        if (length(pline) != 0)
            print pline
        pline = $0
    }
}

END {
    if (total >= 150) {
        print pline
    } else {
        sub(/[0-9.]+/, "5.0000", pline)
        n = int((150 - total) / 5)
        for (i = 0; i <= n; i++)
            print pline
    }
}

论坛徽章:
16
CU十二周年纪念徽章
日期:2013-10-24 15:41:3415-16赛季CBA联赛之广东
日期:2015-12-23 21:21:55青铜圣斗士
日期:2015-12-05 10:35:30黄金圣斗士
日期:2015-11-26 20:42:16神斗士
日期:2015-11-19 12:47:50每日论坛发贴之星
日期:2015-11-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-18 06:20:002015亚冠之城南
日期:2015-11-10 19:10:492015亚冠之萨济拖拉机
日期:2015-10-28 18:47:282015亚冠之柏太阳神
日期:2015-08-30 17:21:492015亚冠之山东鲁能
日期:2015-07-07 18:48:39摩羯座
日期:2014-08-29 23:01:42
5 [报告]
发表于 2015-09-12 15:33 |只看该作者
本帖最后由 tc1989tc 于 2015-09-12 15:34 编辑
  1. #!/bin/sh

  2. appendFiles=$1

  3. # awk params
  4. modifyNum=5.0000
  5. sumNum=150
  6. startLine=13

  7. for i in $appendFiles;do
  8.     awk -vmodifyNum=$modifyNum -vsumNum=$sumNum -vstartLine=$startLine -vfile=$i \
  9.     '/^2.0000/{lastLine=$0} {if (NR >= startLine)sum +=$1}
  10.       END{sub(/^2.0000/,modifyNum,lastLine);sum -= 2.0;reNum=sumNum - sum;
  11.       if (reNum >0){item=(reNum + 4)/5;for (i=0;i<item;i++)print lastLine >> file} }' $i
  12. done
复制代码
./append.sh files

论坛徽章:
3
2015亚冠之布里斯班狮吼
日期:2015-06-25 18:46:20程序设计版块每日发帖之星
日期:2015-09-17 06:20:0015-16赛季CBA联赛之江苏
日期:2017-01-09 21:37:58
6 [报告]
发表于 2015-09-13 01:44 |只看该作者
回复 5# tc1989tc

您好!谢谢您的帮助,但是运行还是报错。我来慢慢研究下,刚接触shell。。。

报错信息如下:

bash-3.2$ ls
21.0_98.0.mod        append.sh
bash-3.2$ ./append.sh 21.0_98.0.mod
bash: ./append.sh: Permission denied
bash-3.2$ sh append.sh 21.0_98.0.mod
awk: invalid -v option

   

论坛徽章:
3
2015亚冠之布里斯班狮吼
日期:2015-06-25 18:46:20程序设计版块每日发帖之星
日期:2015-09-17 06:20:0015-16赛季CBA联赛之江苏
日期:2017-01-09 21:37:58
7 [报告]
发表于 2015-09-13 01:49 |只看该作者
回复 4# MMMIX

谢谢您的帮助,我保存运行,报错。

报错信息如下:
bash-3.2$ ls
21.0_98.0.mod        append.sh        test.sh
bash-3.2$ sh test.sh 21.0_98.0.mod
test.sh: line 3: syntax error near unexpected token `{'
test.sh: line 3: `if(NR < 13){'
bash-3.2$ sh test.sh
test.sh: line 3: syntax error near unexpected token `{'
test.sh: line 3: `if(NR < 13){'

   

论坛徽章:
3
2015亚冠之布里斯班狮吼
日期:2015-06-25 18:46:20程序设计版块每日发帖之星
日期:2015-09-17 06:20:0015-16赛季CBA联赛之江苏
日期:2017-01-09 21:37:58
8 [报告]
发表于 2015-09-13 02:24 |只看该作者
本帖最后由 tengfei0311 于 2015-09-13 02:26 编辑

回复 5# tc1989tc


您好!我已经调通可以运行了,太谢谢您了,但是还有一个问题。见图红框部分。

就是最后一行2.0000没有改,你是直接把最后一行2.0000改成5.0000就复制在后面,最后一行你没有任何操作,我是想最后一行也要操作 把2.0000也改成5.0000,在复制改后的5.000行,直到第一列值求和到150停止。

现在的问题就是多了这一行数据,我计算了一下,把最后哪行要改的数据(图片红框行)删掉就对了 或者把最后一行(图片红框这一行)2.0000改成5.0000 那么整个文件数据也就多一行5.0000的数据。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
9 [报告]
发表于 2015-09-13 08:49 |只看该作者
回复 7# tengfei0311


    我那是个 AWK 脚本,不是 shell 脚本。

论坛徽章:
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
10 [报告]
发表于 2015-09-13 10:08 |只看该作者
回复 1# tengfei0311

$ awk -vst=13 -vmax=150 -vmul=5 '{
  if(S0!="")
    print S0;
  if(NR>=st)
    total+=S1;
  S0=$0;
  S1=$1;
}
END{
  diff=max-total;
  if(diff<0){
    print S0;
    exit;
  }
  sub(/[^ ]+/,"5.000",S0);
  for(n=0;n<=diff;n+=mul)
    print S0;
}' test.mod

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP