免费注册 查看新帖 |

Chinaunix

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

bash处理文本总结 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-04 15:14 |只看该作者 |倒序浏览
1. 求两个文件的交集,并集
    交集: 假设有a.txt 和b.txt,每个文件都有用户的手机号,每个手机号各占一行,找出a.txt和b.txt中都有的手机号
            法1. awk 'NR==FNR{ arr[$0]="x" } NR>FNR{ if(arr[$0]!=""){ print $0 } }' a.txt b.txt
            法2. 使用grep的-f FILE选项。 缺点: 当FILE里的记录数稍微多一点, 检索的速度就变的相当的慢.
   
    并集: 假设有两个文件a.txt和b.txt, 其中a.txt中有两列, 第一列为手机号, 第二列为该手机今天上行的短信条数; b.txt中也有两列,第一列为为手机号, 第二列为该手机号今天的消费数,要求把a,b两文件合并成一个,输出“手机号 上行短信数 消费数”这样一个文本, 某列的数据为空则补零
            法1. awk 'NR==FNR{ a[$1]=$2 } NR>FNR{ if(a[$1] != ""){ print $1, a[$1], $2 }else{ print $1, 0, $2 }; a[$1]="x" } END{ for(i in a){ if(a!="x"){ print i, a, 0} } }' a.txt b.txt
            法2. 使用join。 缺点: 一是需要对join的对象文件先做好排序, 二是join的对象文件只支持两个域,三是join支持的key不能包含空格, 而awk的数组下标字符串可以包含空格,从而法1可以支持多个域作为key来合并两个文件
    NR  ( Number of Record) 经过awk处理的总记录数
    FNR ( File Number of Recored ) awk处理的当前文件的记录数, 想上面的, 当awk在读b.txt的时候, FNR重新变成0, NR则在a.txt的记录数上继续增加
2. 还需要unix2dos/dos2unix么?
    并不是不需要unix2dos/dos2unix, 问题是unix2dos这个工具在我们大多数linux服务器上根本没有。 xx: bin, 你给偶的文件怎么格式乱乱的啊. 偶bin总不能说, xx你拿ue做一下unix到dos文本的格式转换吧。其实弄清楚windows与unix文本格式的差异, 及awk处理文本的方式,用一条很简单的命令就
可以实现unix2dos的功能了。 赶快试试吧:)
            awk '{ print $0"\r" }' ur_file > ur_file.txt
    dos2unix这个工具偶们的服务器上一般是有的, 但是万一要是木有呢? 不能站着干着急, 把windows格式文本里的'\r'这个字符删掉就OK,试试这个吧:
            tr -d '\r'  unixfile.txt
            或者strings dosfile.txt > unixfile.txt
3. sed的域
    xx:     bin,快帮我从日志里统计一下昨天每个用户的消费数
    bin:    re啊, yyGG的日志里怎么没有记录消费数这个域啊, 不过记录的短信内容都里“本条mm元”的字样。 hoho, 这不好办了吗,赶快使用sed来提取出mm吧。
        $ head -n 1 uidown_20090201.log
        [00:00:00] |0000832f08018000|0|172.25.69.147|CmdFeeXX|Fee_Pass_Succ_ab|106617022|15999658888||xxgmcc|xxgmcc|755||1|WX|NORMAL|-NZSJGM2|JPCxxx|2|200|0|10661700612||1|3030303030303137313136333433373234323639|0000832f08018000|1|欢迎使用象棋游戏, 本条2元(不含通信费),询8888|
        $ awk -F'|' '{ print $1"|"$3"|"$8"|"$28 }' uidown_20090201.log |  sed -n 's/.*|\(.*\)|\(.*\)|.*本条\(.*\)元.*/\2 \3/p'         
        看看是不是把手机号和用户的消费数打印出来啦~~~
   

PS:
strings命令在一个目标或者二进制文件中查找可打印字符串,这使你可以读嵌入到二进制文件中的文本字符串,该字符串对编程可能很有用。也可以理解为“只打印可显示字符”, 这样会把win格式文件每行的\r都去掉

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/86696/showart_1812706.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP