##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
```