文本处理的一些使用总结


##awk 的一些使用总结

###awk 内置义变量
```
$0	当前记录(作为单个变量)
$1~$n	当前记录的第n个字段,字段间由FS分隔
FS	输入字段分隔符 默认是空格
NF	当前记录中的字段个数,就是有多少列
NR	已经读出的记录数,就是行号,从1开始
RS	输入的记录他隔符默 认为换行符
OFS	输出字段分隔符 默认也是空格
ORS	输出的记录分隔符,默认为换行符
ARGC	命令行参数个数
ARGV	命令行参数数组
FILENAME	当前输入文件的名字
IGNORECASE	如果为真,则进行忽略大小写的匹配
ARGIND	当前被处理文件的ARGV标志符
CONVFMT	数字转换格式 %.6g
ENVIRON	UNIX环境变量
ERRNO	UNIX系统错误消息
FIELDWIDTHS	输入字段宽度的空白分隔字符串
FNR	当前记录数
OFMT	数字的输出格式 %.6g
RSTART	被匹配函数匹配的字符串首
RLENGTH	被匹配函数匹配的字符串长度
SUBSEP	\034
```

####1 linux 多行转换为 单行 每5行合并成一行
```
awk '{if(NR%5) {ORS=""} else {ORS="\n\n"};print;}'
```
####2 awk多文件处理
```
awk 'NR==FNR { 第一个文件; next } { 第二个文件 } ' file1 file2
```
这种多文件的处理可以用来做普通的join ,或者一个文件作为key-value映射,而另一个是需要处理的文件。这中方法比jion命令更灵活,更能处理一些复杂的逻辑
比如之前在项目里使用的脚本
```
awk 'NR==FNR { a[$2]=$1; next } {{printf $1} for(i=2;i<=NF;i++) { printf " "a[$i]" "} {print ""} } ' deerwester.txt  company >company_index
```
####3 awk 复杂分隔符处理 以及for 变量处理 $i 字段
```
awk 'BEGIN{FS="[\t =,]"}{for(i=2;i>red_index
```
#### 4 awk随机数
在BEGIN模块设定随机数种子srand(),在逐行读取文件的模块输出随机数rand()。
其中rand()的大小在(0,1)之间。
```
awk -F"\t" 'BEGIN{ 
srand(); 
}{ 
value=int(rand()*100); 
print value 
if(value<=10) 
print value"\t"NR 
}' 
```
注意,srand()需要写在BEGIN模块,才能正常产生随机数,这是awk的工作机制决定的。
####5 文本的交差并和
假设 a.txt 包括 a, c, b 三行。假设 b.txt 包括 d, e, c, b 四行。

交集,把两个文件放到一起排序,只输出次数多于一次的项:
```
$ sort a.txt b.txt | uniq -d
b
c

求一个文件的差集(A-B)
[root@rhlei aaa]# cat a
1
2
3
4
[root@rhlei aaa]# cat b
2
4
5
6
[root@rhlei aaa]# sort a b |uniq -u
1
3
5
6
[root@rhlei aaa]# sort a b b |uniq -u
1
3

并集,把两个文件放到一起排序,重复的项只算一次:
$ sort a.txt b.txt | uniq
a
b
c
d
e

差集(A-B),把B的元素重复2份和A的元素放到一起排序,只输出出现一次的项:
$ sort a.txt b.txt b.txt | uniq -u
a

对称差,把两个文件放到一起排序,只输出出现一次的项:
$ sort a.txt b.txt | uniq -u
a
d
e
```

posted @ 2014-03-01 17:01  haidao2008  阅读(150)  评论(0)    收藏  举报