免费注册 查看新帖 |

Chinaunix

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

[文本处理] 求助怎么实现这样的功能 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-06-27 13:06 |只看该作者 |倒序浏览
数据处理,有上万行的数据,结构是这样的:  
a1
...
...
mark
b11 b12
b21 b22  
b31 b32
b41 b42
...
... ------
...
a2
...
...
mark
...
...
-----
现在要求的是数据a在下面的b数据的第一列里面的范围, bn<a<bn+1,怎么用脚本实现呢?现在的问题是怎么把a作为一个变量读进来传递给后面的脚本,并且是一连串的数据。我现在能想到的笨办法就是分割文件然后一个文件一个文件分别处理,但是这样的文件有上万个,实在是太。。。

另外,这个if语句无法传递变量a,怎么修改才可以呢?awk '/first/ {a1=$3} /mark/,/----/ {a[NR]=$1}END{for(i=2;i<=NR;i++){if(a<a && a[i+1]>a) print a}}'



谢谢大家了,困扰两天了没有解决这个问题。。

论坛徽章:
0
2 [报告]
发表于 2014-06-27 13:49 |只看该作者
楼主你要这么写,咱就没得唠了,
...
a2
...
a2根本就是毫无特殊性的一行,凭什么就取它的值?你awk里那/first/又是哪里蹦出来的?

论坛徽章:
0
3 [报告]
发表于 2014-06-27 13:59 |只看该作者
用户名注册后不能更改 发表于 2014-06-27 13:49
楼主你要这么写,咱就没得唠了,
...
a2
嗯,我错了,有标志的,可以匹配出来: first  a1
...
...
mark
b11 b12
b21 b22  
b31 b32
b41 b42
...
... ------
...
first a2
...
...
mark
...
...
-----

论坛徽章:
0
4 [报告]
发表于 2014-06-27 14:17 |只看该作者
i是discuz斜体的关键字,直接写会造成显示异常,放到code中就好了。大概是这样
  1. awk '/first/ {a1=$3} /mark/,/----/ {a[NR]=$1}END{for(i=2;i<=NR;i++){if(a<a[i] && a[i+1]>a) print a[i]}}'
复制代码
不知道为什么前面a1后面a。

论坛徽章:
0
5 [报告]
发表于 2014-06-27 15:00 |只看该作者
用户名注册后不能更改 发表于 2014-06-27 14:17
i是discuz斜体的关键字,直接写会造成显示异常,放到code中就好了。大概是这样不知道为什么前面a1后面a。


每个a是不同的,这样有可能用一个语句读进来处理么?
我尝试用两个数组,一个存储a,另一个存储b,但是好像这样不能判断,因为b是分块的。。
awk '/first/ {a[i++]=$3} /mark/{p=1;next}/---/{p=0}p {b[j++]=$2}END {for(k=0;k<NR;k++) if(b[k]...???

论坛徽章:
780
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
6 [报告]
发表于 2014-06-27 15:04 |只看该作者
回复 1# zsjan

没看懂需求。。。
  1. a1
  2. ...
  3. ...
  4. mark
  5. b11 b12
  6. b21 b22  
  7. b31 b32
  8. b41 b42
  9. ...
  10. ... ------
  11. ...
  12. a2
  13. ...
  14. ...
  15. mark
  16. ...
  17. ...
  18. -----
复制代码
期望的结果是什么?
   

论坛徽章:
0
7 [报告]
发表于 2014-06-27 15:12 |只看该作者
Herowinter 发表于 2014-06-27 15:04
回复 1# zsjan

没看懂需求。。。期望的结果是什么?


呃,我把数据贴一部分吧:

first :   5.7869     0.48 0.2399


  mark
        -25.1560      2.00000
        -25.0447      2.00000
        -25.0446      2.00000
。。。
-------------------------------

  first : 4.28 3.98 5.88


  mark
         -25.1560      2.00000
        -25.0447      2.00000
        -25.0446      2.00000
。。。
--------------------------------
文件是这样重复的,我要计算的是5.7869在下面的第一列-25.1560中的位置,每一组数据都计算一次,不知道这次说明白没有?

论坛徽章:
780
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
8 [报告]
发表于 2014-06-27 15:31 |只看该作者
本帖最后由 Herowinter 于 2014-06-27 15:33 编辑

回复 7# zsjan

几个细节请确认。
1. 对于某个数字,只可能有1个匹配还是有可能有多个?
比如你要找的这个5.7869 后面可不可能有多个,如果有
多个,返回所有符合的行?返回第一个?
2.你要的结果是匹配的行在当前文件中的行号?如果该数字
在后面的文本中没找到返回什么?
   

论坛徽章:
0
9 [报告]
发表于 2014-06-27 15:37 |只看该作者
回复 5# zsjan

怪我了,忘了你这判断是写END里了,写前面。

论坛徽章:
780
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
10 [报告]
发表于 2014-06-27 15:38 |只看该作者
本帖最后由 Herowinter 于 2014-06-27 15:42 编辑

回复 7# zsjan
大概这样的,可能有点出入。
  1. awk '/^[[:space:]]*first/{n=$3;found=0;print "Block "++k": "n;next} /^-+$/{if(!found)print "no matching records";next} $1==n{found=1;print NR": "$0}' i
  2. Block 1: 5.7869
  3. 8:          5.7869       2.12345
  4. Block 2: 4.28
  5. no matching records
复制代码
cat i

  1. first :   5.7869     0.48 0.2399


  2.   mark
  3.         -25.1560      2.00000
  4.         -25.0447      2.00000
  5.         -25.0446      2.00000
  6.          5.7869       2.12345
  7.          0.008        5.7869
  8. ...
  9. -------------------------------

  10.   first : 4.28 3.98 5.88


  11.   mark
  12.          -25.1560      2.00000
  13.          -25.0447      2.00000
  14.          -25.0446      2.00000
  15. ...
  16. --------------------------------
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP