免费注册 查看新帖 |

Chinaunix

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

[文本处理] 请教一个稍微复杂一点的数据处理问题 [复制链接]

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-05-04 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-04-09 01:03 |只看该作者 |倒序浏览
本帖最后由 vcuteym 于 2016-04-09 15:40 编辑

原始数据格式如下。这个数据的规律是这样的。有k-point,band,ion三个递增的变量。

-----------------------------------------------------------------------------
k-point    1 :    0.00000000 0.00000000 0.00000000     weight = 0.00462963

band   1 # energy  -23.93647611 # occ.  1.00000000

ion      s     py     pz     px    dxy    dyz    dz2    dxz    dx2    tot
  1  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000
  2  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000
tot  0.000  0.000  0.000  0.000  0.240  0.172  0.151  0.172  0.243  0.911
  1  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000
  2  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000
tot  0.000  0.000  0.000  0.000 -0.145  0.135 -0.006  0.071  0.147  0.211
  1  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000
  2  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000
tot  0.000  0.000  0.000  0.000 -0.148  0.071 -0.007  0.133  0.149  0.111
  1  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000
  2  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000
tot  0.000  0.000  0.000  0.000  0.122  0.081 -0.151  0.083  0.123  0.211

band   2 # energy  -23.93647516 # occ.  1.00000000

ion      s     py     pz     px    dxy    dyz    dz2    dxz    dx2    tot
  1  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000
  2  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000
tot  0.000  0.000  0.000  0.000  0.240  0.172  0.151  0.172  0.243  0.912
  1  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000
  2  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000
tot  0.000  0.000  0.000  0.000 -0.145  0.135 -0.006  0.071  0.147  0.212
  1  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000
  2  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000
tot  0.000  0.000  0.000  0.000 -0.148  0.071 -0.007  0.133  0.149  0.112
  1  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000
  2  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000
tot  0.000  0.000  0.000  0.000  0.122  0.081 -0.151  0.083  0.123  0.212

k-point    2 :    0.16666667 0.00000000 0.00000000     weight = 0.00462963

band   1 # energy  -23.93638065 # occ.  1.00000000

ion      s     py     pz     px    dxy    dyz    dz2    dxz    dx2    tot
  1  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000
  2  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000
tot  0.000  0.000  0.000  0.000  0.240  0.172  0.151  0.172  0.243  0.921
  1  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000
  2  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000
tot  0.000  0.000  0.000  0.000 -0.145  0.135 -0.006  0.071  0.147  0.221
  1  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000
  2  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000
tot  0.000  0.000  0.000  0.000 -0.148  0.071 -0.007  0.133  0.149  0.121
  1  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000
  2  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000
tot  0.000  0.000  0.000  0.000  0.122  0.081 -0.151  0.083  0.123  0.221

band   2 # energy  -23.93631675 # occ.  1.00000000

ion      s     py     pz     px    dxy    dyz    dz2    dxz    dx2    tot
  1  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000
  2  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000
tot  0.000  0.000  0.000  0.000  0.240  0.172  0.151  0.172  0.243  0.922
  1  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000
  2  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000
tot  0.000  0.000  0.000  0.000 -0.145  0.135 -0.006  0.071  0.147  0.222
  1  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000
  2  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000
tot  0.000  0.000  0.000  0.000 -0.148  0.071 -0.007  0.133  0.149  0.122
  1  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000
  2  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000
tot  0.000  0.000  0.000  0.000  0.122  0.081 -0.151  0.083  0.123  0.222

------------------------------------------------------------------------------
我的数据处理需求是,对于指定的band,要遍历所有的k-point,并给出k-point冒号后面的三个数值。然后在当前k-point下,指定band下,给出所在行和列都有tot字符的那个数值。
例如,现在指定band为2,则输出应该如下
------------------------------------------------------------------------------------
0.00000000 0.00000000 0.00000000  0.912 0.212 0.112 0.212
0.16666667 0.00000000 0.00000000  0.922 0.222 0.122 0.222
------------------------------------------------------------------------------------
0.00000000 0.00000000 0.00000000 是k-point 1冒号后面的,0.16666667 0.00000000 0.00000000是k-point 2 冒号后面的。
在kpoint为1,指定band为2下,0.912 0.212 0.112 0.212 这几个数字的所在行和列都有tot字符。
基本说清楚了。实际文件的kpoint和band可能有几十个。

数据有点多,3楼上传了数据附件。大神帮测试一下

先谢谢了!

论坛徽章:
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
2 [报告]
发表于 2016-04-09 11:03 |只看该作者
本帖最后由 moperyblue 于 2016-04-11 12:01 编辑
  1. sed -nr '/k-point\s/{s/.*:\s*((\S+\s+){2}\S+).*/\1 /;h};/band\s*\b2\b/{n;:a;n;/^tot/{s/.*\s//;H};/^\s*$/!{$!ba};g;s/\n/ /gp}' procar
  2. awk -v val=2 'flag&&/^ +$/{print s;next}flag&&/^tot/{s=s FS $NF}/^band /{flag=$2==val;getline}/k-point /{s=$4 FS $5 FS $6}' procar
  3. awk -v val=2 'flag&&/^tot/{s=s FS $NF;i++}i==4{print s;i=0}/^band /{flag=$2==val}/k-point /{s=$4 FS $5 FS $6}' procar
复制代码
注意:源数据文件band之间的分隔行有空格!

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-05-04 06:20:00
3 [报告]
发表于 2016-04-09 15:33 |只看该作者
回复 2# moperyblue
大神,好像不太行,处理出来数据乱七八糟。我在附件里给了个完整的数据,请帮我测试一下。
对这个数据,指定band为2,则输出应该是
-----------------------------------------------------------------------
0.00000000 0.00000000 0.00000000  0.995  -0.574  -0.574  -0.574     (注释:0.00000000 0.00000000 0.00000000 是k-point    1 :后面的三个数。k-point    1 和k-point    2之间的band 2里面,0.995  -0.574  -0.574  -0.574都是最后一列,并且所在行第一列是tot)
0.16666667 0.00000000 0.00000000  0.995  -0.574  -0.574  -0.574      (注释:0.16666667 0.00000000 0.00000000 是k-point    2 :后面的三个数。k-point    2 和k-point    3之间的band 2里面,0.995  -0.574  -0.574  -0.574都是最后一列,并且所在行第一列是tot)
...
...
0.50000000 0.50000000 0.33333333  0.995  -0.575  -0.575  -0.575      (注释:0.50000000 0.50000000 0.33333333 是k-point    19 :后面的三个数。k-point    19 和k-point    20之间的band 2里面,0.995  -0.575  -0.575  -0.575都是最后一列,并且所在行第一列是tot)
...
...


非常感谢!


PROCAR.rar

124.99 KB, 下载次数: 8

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-05-04 06:20:00
4 [报告]
发表于 2016-04-09 15:36 |只看该作者
本帖最后由 vcuteym 于 2016-04-09 15:37 编辑

回复 2# moperyblue
大神,好像不太行,处理出来数据乱七八糟。我在楼上附件里给了个完整的数据,请帮我测试一下。
对这个附件数据,指定band为2,则输出应该是
-----------------------------------------------------------------------
0.00000000 0.00000000 0.00000000  0.995  -0.574  -0.574  -0.574     (解释:0.00000000 0.00000000 0.00000000 是k-point    1 :后面的三个数。k-point    1 和k-point    2之间的band 2里面,0.995  -0.574  -0.574  -0.574都是最后一列,并且所在行第一列是tot)

0.16666667 0.00000000 0.00000000  0.995  -0.574  -0.574  -0.574      (解释:0.16666667 0.00000000 0.00000000 是k-point    2 :后面的三个数。k-point    2 和k-point    3之间的band 2里面,0.995  -0.574  -0.574  -0.574都是最后一列,并且所在行第一列是tot)
...
...
0.50000000 0.50000000 0.33333333  0.995  -0.575  -0.575  -0.575      (解释:0.50000000 0.50000000 0.33333333 是k-point    19 :后面的三个数。k-point    19 和k-point    20之间的band 2里面,0.995  -0.575  -0.575  -0.575都是最后一列,并且所在行第一列是tot)
...
...


非常感谢!

   

论坛徽章:
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
5 [报告]
发表于 2016-04-09 17:11 |只看该作者
回复 1# vcuteym

$ awk -vb=2 'function out(){if(p)print s}/^band/{out();p=$2==b;s=k}/^k-point/{k=$4" "$5" "$6}p&&/^tot/{s=s" "$NF}END{out()}' FILE
0.00000000 0.00000000 0.00000000 0.912 0.212 0.112 0.212
0.16666667 0.00000000 0.00000000 0.922 0.222 0.122 0.222

   

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-05-04 06:20:00
6 [报告]
发表于 2016-04-09 17:47 |只看该作者
回复 5# jason680

大神太厉害了。
我测试了一下,输出是


0.912 0.212 0.112 0.212
0.922 0.222 0.122 0.222

前面三列没输出出来,怎么回事?后面的结果是对的!

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-05-04 06:20:00
7 [报告]
发表于 2016-04-09 17:58 |只看该作者
回复 5# jason680
k-point前面加了个空格,好了,太厉害了

   

论坛徽章:
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
8 [报告]
发表于 2016-04-09 18:56 |只看该作者
本帖最后由 moperyblue 于 2016-04-11 12:01 编辑

回复 4# vcuteym


    已改
  1. sed -nr '/k-point\s/{s/.*:\s*((\S+\s+){2}\S+).*/\1 /;h};/band\s*\b2\b/{n;:a;n;/^tot/{s/.*\s//;H};/^\s*$/!{$!ba};g;s/\n/ /gp}' procar
  2. awk -v val=2 'flag&&/^ +$/{print s;next}flag&&/^tot/{s=s FS $NF}/^band /{flag=$2==val;getline}/k-point /{s=$4 FS $5 FS $6}' procar
  3. awk -v val=2 'flag&&/^tot/{s=s FS $NF;i++}i==4{print s;i=0}/^band /{flag=$2==val}/k-point /{s=$4 FS $5 FS $6}' procar
复制代码
注意:源数据文件band之间的分隔行有空格!

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-05-04 06:20:00
9 [报告]
发表于 2016-04-10 10:10 |只看该作者
回复 8# moperyblue

这个好用,厉害


   

论坛徽章:
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
10 [报告]
发表于 2016-04-10 13:59 |只看该作者
本帖最后由 sunzhiguolu 于 2016-04-10 14:00 编辑

回复 9# vcuteym
试下:
  1. perl -ane 'BEGIN{$sB=2;$sE=$sB+1}{if (/\A\s+k-point\b/){print "\n@F[3,4,5]";next}if (/\Aband\s+$sB\b/ .. /\Aband\s+$sE/){if (/\Atot\b/){print " $1" if (/(\S+)\Z/)}}}' urfile
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP