- 论坛徽章:
- 0
|
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 |
|