Blog on 27th Floor
主页 随便 电脑 电影 社会 阅读 下载 本站 存档
主页 随便 电脑 电影 社会 阅读 下载 本站 存档

GNU文本处理实用程序

04/27/06。  cathayan.org版权所有,保留一切权利。转载请保留此说明。谢绝商业转载。


Unix环境下有一系列的文本处理实用程序(现在主要是GNU了),但我一直没有从事过这方面的工作,所以了解不深;直到某日,看到个一长串Perl脚本,里面充满了Perl专有变量,正仰慕间,出来一神,用一行Shell给代替了,里面当然有几个管道,外加cut, sort, uniq共3个小程序,真是简单优美啊。

cut: 输出行中选定部分,这部分可以是某些位置上的字符,也可以是一个区段(有分隔的情况,缺省分隔符是TAB)。
sort: 把输入内容(文件)按行排序,可以按整行的字母或数字顺序来排,也可以指定以某个(或某几个)字段为关键字来排,每段也可指定正序或倒序,甚至可以指定按某段中的第几个字符来排序,是不是超强?
uniq: 输出文件中的不重复行,也就是把重复的去掉;当然也可以输出重复行,或是完全没有重复的行。

想来自己编程写个取一行中某字符的程序还算不难,但要把sort写好也不是很容易吧(估计Perl中有现成的库?),有这些GNU出品的东西,实在是太好了。

也曾经处理过一大堆资料,全是Excel表格,简单的像调整一下列的位置了,把记录里多加的某字符替换掉了一类,就在Excel里面做了,但像取出所有列第2-第5字符之间的字符另存一列,或根据某列的数据经过计算生成新的一列这种,就不太会了。

好在对编程还有点概念,又听说过Perl处理文本最强,就找来本入门的书,又装了Activeperl,就开工了。幸好Excel还能输出成文本文件。这类工作用Perl处理实在是牛刀杀鸡,写上几行就解决了,所以到现在也没有写过10行以上的Perl,也不会用Perl的那些奇怪变量。今后要是再有这种工作,也许可以用点GNU工具了。

这一套实用程序也有Win32版--开源就是好--有人专门打了编译好的,里面程序更多,包括超强的wget,grep等等,还带一个zsh :P 这个包是真正的Win32程序,不需要cygwin一类的中介了。

当然,目的是高效地完成工作,如果在Excel点点鼠标就能搞定,就没有必要学习了。

04/27/06 17:09:44,由cathayan发表。目录:电脑

8条评论

当年打工的时候写自动备份脚本,那个时候不会用`date +xxxx`,为了实现这个功能只好学习了一下perl写了个充斥着system的perl程序。
后来那就是我写过的唯一的一个perl程序了。。。

http://wang.yuxuan.org/blog/ fishy 于 04/27/06 18:17:32 发表. 

给你补充一下:
用于拿到文本前n行的head
用于拿到文本后n行的tail
用于搜索的grep
用于替换的sed
用于逐行处理文本的awk (简单用起来很像cut, 处理一行中的某列或者某几列文本很方便)

最近处理试验数据,学习了awk,效率提高很多。:)

http://douzi.org windix 于 04/27/06 21:07:01 发表. 

当初看书时,就是被awk/sed给吓住了,才没有细看这一组东西。想想啊,awk是一门语言,sed号称一个editor,还是算了吧。

http://blog.cathayan.org/member/1 cathayan 于 04/27/06 21:37:28 发表. 

我本来一直想学学 awk, sed 的,但每次碰到 awk,sed 可以做的事情时 Perl 都可以做,而且 awk,sed 不可以做的 Perl 也都可以做。最后就一直没有那个需要学习 awk 和 sed 了..
推荐看看 Perl命令行应用介绍
http://www.perlchina.org/ar...

http://qiang@perlchina.org Qiang 于 04/27/06 22:40:46 发表. 

不要被表象所迷惑,我们一般简单使用还用不到它们那么复杂的功能。要说复杂用法,O'Reilly专门有一本"Sed & Awk"来讲他们:
http://www.oreilly.com/cata...

sed的语法类似ed, vi的始祖,所以指令和vi很像,比如最简单的例子:
sed 's/Cathayan/Windix/g' oldfile >newfile

很好懂吧? :)

再来一个
sed -n 12,18p myfile
把myfile的12-18行内容输出出来
如果不知道sed之前,我可能就会这么用了:
cat myfile | head -n 18 | tail -n 6

awk通常用途都是从一个格式化的文本中提取某几列,输出到新的文件,或者在输出前进行一些简单的操作(比如求和,求平均数),下面来个简单例子:
awk '$1=="tcp" && $2=="1" {print $5+$6, $7}' oldfile > newfile

对于oldfile中的每一行数据,符合第1列为"tcp",第2列为"1"的,输出第5,6两列的和,以及第7列的内容。

最后附个网址
http://www.cs.rmit.edu.au/~...
是对我们一次试验的指导,其中讲sed, awk的内容很简单,也很实用,值得一看。

http://douzi.org windix 于 04/27/06 22:41:42 发表. 

old 了。sed 有 '-i' 选项,不用 oldfile, newfile 倒来倒去。:)

http://williamxu.net9.org william 于 04/28/06 08:57:03 发表. 

上次写mp3 -> ogg的脚本的时候用了很多sed,因为有一点vim的底子所以用起来还是很轻松愉快的,嘿嘿

http://wang.yuxuan.org/blog/ fishy 于 04/28/06 10:50:29 发表. 

还是GNUWin32
http://gnuwin32.sourceforge...

noname 于 05/23/06 14:35:00 发表. 


这篇文章已经关闭,不能添加评论和投票
I am watching and will delete all spam.

我的E-Mail


Copy&Paste Exchange

访问CPeX Group

订阅Feed

订阅Feedburner
Feedsky订阅
本站订阅

请登录

导航

cathayan.org Web

最新贴

RIME 小狼毫/鼠须管的极点及五笔拼音配置
Software that rocks or sucks less
一棵热带的树换新叶的过程
几个有用的Vim招术
论语七 述而
Nomacs 图像浏览器
Windows 文件校验
Windows 10 文件批量命名简单方法
Windows 10 文件删除高级操作
本站也算是有响应式设计了

最新评论

Powered by

Powered by Nucleus CMS

版权声明

Creative Commons License
Blog on 27th floor by Cathayan is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.
Powered by Nucleus CMS v3.71. Best view with Mozilla browsers.