免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2883 | 回复: 10

[文本处理] 请教--剔除有规律的数据 [复制链接]

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-05-04 06:20:00
发表于 2016-04-15 19:46 |显示全部楼层
参看下面的输入、输出文件示例。看第一列数据, ion后面是数字,然后是tot,然后又是数字...tot总共出现4次,然后又出现一个ion,周而复始。要求输出文件,在每个ion下面,只保留ion和第一个tot之间的数据,其他三个tot的数据都删除。注意,示例中的ion后面数字到4,实际每个文件的这个数值不同。附件test.rar中有in和out两个文件供参考。谢谢!
例如:输入文件
----------------------------------------------------------
band   1 # energy  -12.74074364 # occ.  1.00000000

ion      s     py     pz     px    dxy    dyz    dz2    dxz    dx2    tot
  1  0.216  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.216
  2  0.216  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.216
  3  0.192  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.192
  4  0.192  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.192
tot  0.817  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.817
  1 -0.121  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000 -0.121
  2 -0.121  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000 -0.121
  3 -0.107  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000 -0.107
  4 -0.107  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000 -0.107
tot -0.457  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000 -0.457
  1 -0.128  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000 -0.128
  2 -0.128  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000 -0.128
  3 -0.113  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000 -0.113
  4 -0.113  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000 -0.113
tot -0.482  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000 -0.482
  1 -0.126  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000 -0.126
  2 -0.126  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000 -0.126
  3 -0.112  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000 -0.112
  4 -0.112  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000 -0.112
tot -0.476  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000 -0.476

band   2 # energy  -12.74073879 # occ.  1.00000000

ion      s     py     pz     px    dxy    dyz    dz2    dxz    dx2    tot
  1  0.216  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.216
  2  0.216  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.216
  3  0.192  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.192
  4  0.192  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.192
tot  0.817  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.817
  1  0.121  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.121
  2  0.121  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.121
  3  0.107  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.107
  4  0.107  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.107
tot  0.457  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.457
  1  0.128  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.128
  2  0.128  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.128
  3  0.113  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.113
  4  0.113  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.113
tot  0.482  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.482
  1  0.126  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.126
  2  0.126  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.126
  3  0.112  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.112
  4  0.112  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.112
tot  0.476  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.476

----------------------------------------------------------------------------------------------------

输出文件为
----------------------------------------------------------------------------------------------------
k-point    1 :    0.00000000 0.00000000 0.00000000     weight = 0.01587302

band   1 # energy  -12.74074364 # occ.  1.00000000

ion      s     py     pz     px    dxy    dyz    dz2    dxz    dx2    tot
  1  0.216  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.216
  2  0.216  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.216
  3  0.192  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.192
  4  0.192  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.192
tot  0.817  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.817

band   2 # energy  -12.74073879 # occ.  1.00000000

ion      s     py     pz     px    dxy    dyz    dz2    dxz    dx2    tot
  1  0.216  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.216
  2  0.216  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.216
  3  0.192  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.192
  4  0.192  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.192
tot  0.817  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.817

test.rar

351.12 KB, 下载次数: 3

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2016-04-15 20:56 |显示全部楼层
  1. perl -nle 'if(/\Ak-point/){$P=1}print if($P);$P=0 if(/\Atot/)' urfile
复制代码

论坛徽章:
28
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-16赛季CBA联赛之深圳
日期:2016-12-01 10:34:0415-16赛季CBA联赛之新疆
日期:2016-12-07 10:24:2915-16赛季CBA联赛之同曦
日期:2016-12-15 12:06:43CU十四周年纪念徽章
日期:2016-12-18 13:03:4415-16赛季CBA联赛之吉林
日期:2017-01-03 15:52:2515-16赛季CBA联赛之辽宁
日期:2017-01-04 14:58:2415-16赛季CBA联赛之辽宁
日期:2017-01-15 09:42:512016科比退役纪念章
日期:2017-02-06 17:21:50黑曼巴
日期:2017-02-10 15:46:1215-16赛季CBA联赛之上海
日期:2017-03-18 10:14:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
发表于 2016-04-15 21:07 |显示全部楼层
  1. sed -n '/k-point\s/{N;p};/^band/{:a;N;/\ntot/!ba;G;p}' out
复制代码

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-05-04 06:20:00
发表于 2016-04-15 21:13 |显示全部楼层
回复 2# sunzhiguolu
谢谢大神!


   

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-05-04 06:20:00
发表于 2016-04-15 21:13 |显示全部楼层
回复 3# moperyblue
谢谢你!

   

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-05-04 06:20:00
发表于 2016-04-15 21:39 |显示全部楼层
回复 3# moperyblue
有点小问题
空行不对

k-point    2   前面有两空行,你这命令出来就一个空行。什么原因?
   

论坛徽章:
28
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-16赛季CBA联赛之深圳
日期:2016-12-01 10:34:0415-16赛季CBA联赛之新疆
日期:2016-12-07 10:24:2915-16赛季CBA联赛之同曦
日期:2016-12-15 12:06:43CU十四周年纪念徽章
日期:2016-12-18 13:03:4415-16赛季CBA联赛之吉林
日期:2017-01-03 15:52:2515-16赛季CBA联赛之辽宁
日期:2017-01-04 14:58:2415-16赛季CBA联赛之辽宁
日期:2017-01-15 09:42:512016科比退役纪念章
日期:2017-02-06 17:21:50黑曼巴
日期:2017-02-10 15:46:1215-16赛季CBA联赛之上海
日期:2017-03-18 10:14:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
发表于 2016-04-15 22:15 |显示全部楼层
本帖最后由 moperyblue 于 2016-04-15 22:58 编辑

回复 6# vcuteym
  1. sed -n '/k-point\s/{N;p};/^band/{:a;N;/\ntot/!ba;p;:b;n;/^\s$/!bb;G;p}' out
复制代码
处理后的结果tot与band之前有两行 有问题吗? 就是多了一个空行

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-05-04 06:20:00
发表于 2016-04-16 00:53 |显示全部楼层
回复 7# moperyblue

大神啊,有问题!还是不对
tot与band之间是一个空行!
tot与k-point之间是两个空行!   
你看下附件里的in,那个是正确输出文件。还要保留文件最开始的三行

论坛徽章:
28
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-16赛季CBA联赛之深圳
日期:2016-12-01 10:34:0415-16赛季CBA联赛之新疆
日期:2016-12-07 10:24:2915-16赛季CBA联赛之同曦
日期:2016-12-15 12:06:43CU十四周年纪念徽章
日期:2016-12-18 13:03:4415-16赛季CBA联赛之吉林
日期:2017-01-03 15:52:2515-16赛季CBA联赛之辽宁
日期:2017-01-04 14:58:2415-16赛季CBA联赛之辽宁
日期:2017-01-15 09:42:512016科比退役纪念章
日期:2017-02-06 17:21:50黑曼巴
日期:2017-02-10 15:46:1215-16赛季CBA联赛之上海
日期:2017-03-18 10:14:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
发表于 2016-04-17 13:10 |显示全部楼层
  1. sed -n '1{N;p};/k-point\s/{x;p;x;N;p};/^band/{:a;N;/\ntot/!ba;p;:b;n;/^\s$/!bb;p}' out
复制代码
回复 8# vcuteym


   

论坛徽章:
29
程序设计版块每日发帖之星
日期:2016-02-29 06:20:0015-16赛季CBA联赛之天津
日期:2016-08-10 10:33:1115-16赛季CBA联赛之深圳
日期:2016-08-17 15:07:2015-16赛季CBA联赛之佛山
日期:2016-11-07 11:33:5015-16赛季CBA联赛之广夏
日期:2016-11-15 09:13:31CU十四周年纪念徽章
日期:2016-11-24 14:12:25极客徽章
日期:2016-12-07 14:03:4015-16赛季CBA联赛之深圳
日期:2016-12-07 17:15:2715-16赛季CBA联赛之北京
日期:2016-12-22 09:30:0115-16赛季CBA联赛之深圳
日期:2016-12-22 10:49:2115-16赛季CBA联赛之山西
日期:2017-02-10 09:05:3215-16赛季CBA联赛之同曦
日期:2017-02-27 14:19:08
发表于 2016-04-18 09:23 |显示全部楼层
  1. awk -vf=1 'f&&/^tot/{f=!f;print;next}!f&&/^[[:space:]]+$/{f=!f}f' out > in
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP