免费注册 查看新帖 |

Chinaunix

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

高手请看这里,如何实现该功能? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-22 22:44 |只看该作者 |倒序浏览
$cat a.txt
……
filed1 filed2 filed3 filedn
-----  ------ ------     ----
101     335   345    n
……

目标:
要把a.txt中的下列部分
filed1 filed2 filed3
-----  ------ ------
101     335   345

1)取出该部分数据
2)来放到excel里。

其中a.txt中的两个省略号格式不固定
请帮忙看看,我还在研究怎么弄法。

论坛徽章:
0
2 [报告]
发表于 2008-07-22 22:49 |只看该作者
是要-----上下各一行么?
grep -C 1 '-----' a.txt

论坛徽章:
0
3 [报告]
发表于 2008-07-22 22:51 |只看该作者
放到excel里面的话grep -C 1 '-----' a.txt|sed 's/[:space:]/,/' > a.csv,然后用excel打开就行了,我这没有MS OFFICE,你自己测试吧。

论坛徽章:
0
4 [报告]
发表于 2008-07-22 23:28 |只看该作者
原帖由 walkerxk 于 2008-7-22 22:49 发表
是要-----上下各一行么?
grep -C 1 '-----' a.txt



这样不行啊,因为……部分的文字中,也会含有'----'字符呢

我用下面的办法碰到了些问题,请指点
源文件行号和对应的内容如下
    186           -------------------------------------------------------------
    187 ^LSQL ordered by Reads for DB: NODE1  Instance: node1  Snaps: 1 -2
    188 -> End Disk Reads Threshold:    1000
    189
    190                                                      CPU      Elapsd
    191  Physical Reads  Executions  Reads per Exec %Total Time (s)  Time (s) Hash Value
    192 --------------- ------------ -------------- ------ -------- --------- ----------
    193               0           56            0.0    0.0     0.07      0.04  633914867
    194 select q_name, state, delay, expiration, rowid, msgid,    dequeu

###一、找出匹配的行号
<oracle@shadow:/home/oracle>v_a=`cat sp*|awk  '/Physical Reads  Executions/{print NR}'|head -1`
<oracle@shadow:/home/oracle>echo $v_a
191
###测试,取出字段名称,输出到结果文件
cat sp*|awk 'NR==191 {print $1,$2,$3}'>result.csv
<oracle@shadow:/home/oracle>cat result.csv
Physical Reads Executions


###二、找出他的下两行的行号,即字段的值
<oracle@shadow:/home/oracle>v_b=`expr $v_a + 2`
<oracle@shadow:/home/oracle>echo $v_b
193
###测试,输出结果
<oracle@shadow:/home/oracle>cat sp*|awk 'NR==193 {print $1,$2,$3}'
0 56 0.0
###取出字段名称,输出到结果文件
<oracle@shadow:/home/oracle>cat sp*|awk 'NR==193 {print $1,$2,$3}'>>result.txt
<oracle@shadow:/home/oracle>cat result.csv
Physical Reads Executions
0 56 0.0

问题出在这!当要打印这一行(用变量传入行号)的时候,为什么没结果输出呢?
<oracle@shadow:/home/oracle>cat sp*|awk 'NR==$v_b'
<oracle@shadow:/home/oracle>

[ 本帖最后由 yuanfang830 于 2008-7-22 23:31 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2008-07-22 23:46 |只看该作者
awk -v rid="$v_b" 'NR == rid{print $0}'

论坛徽章:
0
6 [报告]
发表于 2008-07-22 23:51 |只看该作者
注意''和""的区别,换成"'就行了,awk我不熟,但是估计是''把$直接转义掉了。

论坛徽章:
0
7 [报告]
发表于 2008-07-22 23:51 |只看该作者

回复 #4 yuanfang830 的帖子

<oracle@shadow:/home/oracle>cat sp*|awk 'NR=="'"$v_b"'"'
              0           56            0.0    0.0     0.07      0.04  633914867

问题已OK,谢谢大家的热心帮忙

[ 本帖最后由 yuanfang830 于 2008-7-22 23:54 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2008-07-23 01:01 |只看该作者
原帖由 yuanfang830 于 2008/7/22 23:51 发表
cat sp*|awk 'NR=="'"$v_b"'"'
              0           56            0.0    0.0     0.07      0.04  633914867

问题已OK,谢谢大家的热心帮忙

我也遇到过类似问题,变量得不到。 要加"" ,试试,不知道有没有其他方法?

论坛徽章:
0
9 [报告]
发表于 2008-07-23 09:40 |只看该作者

  1. awk 'BEGIN{OFS=","}/----/{a=NF;while(getline){if(NF!=a) break;if(a==NF){$1=$1;print}}}' 数据文件
复制代码


解释:
因为---的段数就是字段的个数

当遇到---的时候,就保存当前行的字段数,同时循环读取下一行,如果字段数与---的字段数相同,则表示是数据,需要显示,否则,就退出循环。

OFS="," 是输出时用,作为字段分隔符,这样将结果保存成.csv 的话,直接用excel打开就可以了。

如果只有一行数据,就没有必要循环了,直接用

  1. awk 'BEGIN{OFS=","}/----/{a=NF;getline;if(a==NF){$1=$1;print}}' 数据文件
复制代码

就可以了

[ 本帖最后由 springwind426 于 2008-7-23 09:41 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2008-07-23 10:07 |只看该作者
原帖由 yuanfang830 于 2008-7-22 23:51 发表
cat sp*|awk 'NR=="'"$v_b"'"'
              0           56            0.0    0.0     0.07      0.04  633914867

问题已OK,谢谢大家的热心帮忙



<oracle@shadow:/home/oracle>cat sp*|awk 'NR=='"$v_b"'
这样就可以了,不用那么多
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP