免费注册 查看新帖 |

Chinaunix

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

[文本处理] shell循环读取文本的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-01-08 11:29 |只看该作者 |倒序浏览
本帖最后由 hqlxian 于 2015-01-08 11:30 编辑

现在有这么个文本student.txt,内容:
name zhangsan
age 20
class c10
name lisi
age 21
class c8
我想把所有学生的name分别取出来,分别处理
for n in `sed -n '/name/=' /home/student.txt`
        do
                echo $n
                echo `sed '/^name /!d;s/.* //' /home/student.txt`
                #处理语句
                #******************
        done
目前的执行结果是
1
zhangsan lisi
4
zhangsan lisi
我想要的结果是
1
zhangsan
4
lisi
请问高手们这个应该怎么改?谢谢!

论坛徽章:
10
天蝎座
日期:2013-09-22 22:32:23程序设计版块每日发帖之星
日期:2016-08-07 06:20:00lufei
日期:2016-06-17 17:38:40程序设计版块每日发帖之星
日期:2016-06-12 06:20:002016科比退役纪念章
日期:2016-05-31 15:47:20CU十四周年纪念徽章
日期:2016-05-27 12:24:562015年亚洲杯之阿曼
日期:2015-05-03 21:01:352015年辞旧岁徽章
日期:2015-03-03 16:54:15天蝎座
日期:2013-10-20 21:05:24程序设计版块每日发帖之星
日期:2016-08-11 06:20:00
2 [报告]
发表于 2015-01-08 11:46 |只看该作者
  1. awk '/^name/{print NR "\n" $2}'
复制代码

论坛徽章:
0
3 [报告]
发表于 2015-01-08 12:11 |只看该作者
本帖最后由 hqlxian 于 2015-01-08 12:35 编辑

请问怎么指定取某一个值呢,比如第次个循环里面,我取zhangsan,这时候打印zhangsan,第二个循环里面,再取出来lisi?

论坛徽章:
0
4 [报告]
发表于 2015-01-08 12:19 |只看该作者
额,还不对,请问怎么指定取出某行名字呢?脚本是循环里面,我是想对取出来的内容做处理的。我怎么单独只取zhangsan或者lisi?
liion631818 发表于 2015-01-08 11:46

论坛徽章:
0
5 [报告]
发表于 2015-01-08 12:23 |只看该作者
回复 2# liion631818


    #处理语句
                #******************
这个里面还有要执行的内容,请问我怎么单独取出zhangsan或者lisi呢?
第一次循环,我得到zhangsan,此时我要要对zhangsan做操作的。第二次循环,得到lisi,这时再对lisi操作。所以我想在单独取出其中的某一个值

论坛徽章:
10
天蝎座
日期:2013-09-22 22:32:23程序设计版块每日发帖之星
日期:2016-08-07 06:20:00lufei
日期:2016-06-17 17:38:40程序设计版块每日发帖之星
日期:2016-06-12 06:20:002016科比退役纪念章
日期:2016-05-31 15:47:20CU十四周年纪念徽章
日期:2016-05-27 12:24:562015年亚洲杯之阿曼
日期:2015-05-03 21:01:352015年辞旧岁徽章
日期:2015-03-03 16:54:15天蝎座
日期:2013-10-20 21:05:24程序设计版块每日发帖之星
日期:2016-08-11 06:20:00
6 [报告]
发表于 2015-01-08 12:44 |只看该作者
回复 5# hqlxian
awk中的$2就是你要的,处理这个就好了

   

论坛徽章:
10
天蝎座
日期:2013-09-22 22:32:23程序设计版块每日发帖之星
日期:2016-08-07 06:20:00lufei
日期:2016-06-17 17:38:40程序设计版块每日发帖之星
日期:2016-06-12 06:20:002016科比退役纪念章
日期:2016-05-31 15:47:20CU十四周年纪念徽章
日期:2016-05-27 12:24:562015年亚洲杯之阿曼
日期:2015-05-03 21:01:352015年辞旧岁徽章
日期:2015-03-03 16:54:15天蝎座
日期:2013-10-20 21:05:24程序设计版块每日发帖之星
日期:2016-08-11 06:20:00
7 [报告]
发表于 2015-01-08 12:47 |只看该作者
  1. while read line; do set -- $line; if [[ "$1" =~ "name" ]]; then echo "do your action for "$2; fi; done
复制代码
这样???

论坛徽章:
0
8 [报告]
发表于 2015-01-08 13:19 |只看该作者
回复 7# liion631818


    这样的结果是
name zhangsan
age 20
class c10
name lisi
age 21
class c8
把所有的内容全输出出来了

论坛徽章:
0
9 [报告]
发表于 2015-01-08 13:27 |只看该作者
本帖最后由 hqlxian 于 2015-01-08 13:29 编辑

回复 7# liion631818


    是这个意思,不过好像输出的结果还不对

while read line;
        do echo $line;
        if [[ "$1" =~ "name" ]];then
        echo "do my action for "$2;
        fi;
        done</home/student.txt

输入结果
name zhangsan
age 20
class c10
name lisi
age 21
class c8

论坛徽章:
9
射手座
日期:2014-07-29 13:05:07双子座
日期:2015-01-11 17:01:522015年亚洲杯之朝鲜
日期:2015-02-01 16:14:282015亚冠之阿尔艾因
日期:2015-06-04 17:54:40数据库技术版块每日发帖之星
日期:2015-08-02 06:20:00数据库技术版块每日发帖之星
日期:2015-10-28 06:20:00数据库技术版块每日发帖之星
日期:2015-11-26 06:20:0015-16赛季CBA联赛之天津
日期:2016-06-20 17:09:2015-16赛季CBA联赛之青岛
日期:2017-02-26 15:54:19
10 [报告]
发表于 2015-01-08 13:29 |只看该作者
回复 6# liion631818
  1. for n in `[color=Yellow]awk '/^name/{print $2}[/color]' file`
  2.         do
  3.                 echo $n
  4.                 #其他动作           
  5.                 #****************
  6.         done
  7. ~               
复制代码
二楼说的很清楚了,你只是把他的代码加进你脚本就行
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP