今天在网上看到一篇关于awk的精华文章,我边读边实验,着实佩服。特别感谢原作者的分享!
原文作者:
原文地址:
按照作者的说明,例子是从CU论坛的,虽然没有找到对应的帖子,还是要特别感谢一下例子的提供作者。
1、我是按照原文思路实验的,过程如下:
1.1、用某一文件的一个域替换另一个文件中的的特定域
- # cat s
- root:XXXXXXXXXXXXXXX.:14995:0:99999:7:::
- oracle:YYYYYYYYYYYYYYYY:14984:0:99999:7:::
- # cat p
- root:x:0:0:root:/root:/bin/bash
- oracle:x:500:501::/home/oracle:/bin/bash
预期结果:
- root:XXXXXXXXXXXXXXX.:0:0:root:/root:/bin/bash
- oracle: YYYYYYYYYYYYYYYY:500:501::/home/oracle:/bin/bash
命令
- # awk 'BEGIN{OFS=FS=":"} NR==FNR{a[$1]=$2}NR>FNR{$2=a[$1];print }' s p
1.2、比较 file1的1-4字符 和 file2的2-5 字符,如果相同,将file2 的第二列 与 file1 合并
- # cat file1
- 0011AAA 200.00 20050321
- 0012BBB 300.00 20050621
- 0013DDD 400.00 20050622
- 0014FFF 500.00 20050401
- 0011AAA 200.00 20050321 11111
- 0012BBB 300.00 20050621 22222
- 0013DDD 400.00 20050622 66666
- 0014FFF 500.00 20050401 55555
- # cat file2
- I0011 11111
- I0012 22222
- I0014 55555
- I0013 66666
预期结果
- 0011AAA 200.00 20050321 11111
- 0012BBB 300.00 20050621 22222
- 0013DDD 400.00 20050622 66666
- 0014FFF 500.00 20050401 55555
- 0011AAA 200.00 20050321 11111 11111
- 0012BBB 300.00 20050621 22222 22222
- 0013DDD 400.00 20050622 66666 66666
- 0014FFF 500.00 20050401 55555 55555
命令:(以下两种都可以)
- # awk 'NR==FNR{a[substr($1,2,5)]=$2} NR>FNR{print $0" "a[substr($1,1,4)]}' file2 file1
- # awk 'NR==FNR{a[b=substr($1,2,5)]=$2} NR>FNR{print $0" "a[b]}' file2 file1
命令虽然和原文的有些出入,但是结果都是一样的。想到了就要实验一下,以验证自己的理解。
2、内置变量汇总:
- NR:已经读取的记录条数
- FNR:正在读取的文件中已经读取的记录条数
- ARGIND:文件所在参数列表的位置
- ARGC:命令行参数的个数
- ARGV:命令行参数数组
- FS:用于指定记录域分隔符
- OFS:用于指定输出记录域分割符
- NF:记录域的个数
- ORS:记录的分隔符
还有三个例子没有实验,这里就先不引用了。等学习了,再分享过来。
参考资料: