LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1126|回复: 9

请教一个小程序

[复制链接]
发表于 2006-8-22 19:13:13 | 显示全部楼层 |阅读模式
有一个文件:test.txt,内容如下:

Name:liuxq, update 2006-8-20
Grade:80, update 2006-8-20

Name:kongyy, update 2006-8-20
Grade:86, update 2006-8-20
..................

现在需要根据此文件得到一个新文件 new.txt,格式如下:
liuxq 80
kongyy 86
..................

麻烦各位了,先谢啦!
发表于 2006-8-22 23:00:06 | 显示全部楼层
You can take a look the s,N commands of sed.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-8-24 23:31:32 | 显示全部楼层
看了,但是不会用,你可否给写个大概。
回复 支持 反对

使用道具 举报

发表于 2006-8-25 09:40:21 | 显示全部楼层
这个不用循环能完成吗?请给个最简单的方法。
回复 支持 反对

使用道具 举报

发表于 2006-8-25 10:22:12 | 显示全部楼层
方法比较苯,感兴趣你再优化

$ awk -F":" '{ print  $2 }' filename |awk -F"," '{ print $1 }'|sed '/^$/d'|sed '$!N;s/\n/ /'
回复 支持 反对

使用道具 举报

发表于 2006-8-25 14:28:33 | 显示全部楼层
能说说
sed '$!N;s/\n/ /'
的 $!N 是什么意思吗? 看不懂啊
回复 支持 反对

使用道具 举报

发表于 2006-8-25 21:58:42 | 显示全部楼层

个人理解

sed '$!N;s/\n//'
$! 是条件 即不是最后一行
N为操作 即把下一行内容读入 pattern space
然后 替换 \n 为 空
这步仿佛是要把 多行并一行
回复 支持 反对

使用道具 举报

发表于 2006-8-28 11:40:30 | 显示全部楼层
感谢各位!我也明白了。谢谢。
回复 支持 反对

使用道具 举报

发表于 2006-8-28 13:05:54 | 显示全部楼层
sed '/Name/{:a;N;/Grade/ta;s/Name:\([^,]*\).*\nGrade:\([^,]*\).*/\1 \2/g}'
回复 支持 反对

使用道具 举报

发表于 2006-8-28 23:26:30 | 显示全部楼层
提供两种认为还可以的方法

awk -F"[:,]" '/Name/{ORS=" ";print $2};/Grade/{ORS="\n";print $2}' filename

awk  -F"[:,]"  -v RS="Name" '{print $2" "$4}' filename
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表