awk 实用操作记录 精妙用法 No.1 substr

1460阅读 0评论2016-05-23 eatmyshort
分类:Python/Ruby


今天在网上看到一篇关于awk的精华文章,我边读边实验,着实佩服。特别感谢原作者的分享!
原文作者: 
原文地址:
按照作者的说明,例子是从CU论坛的,虽然没有找到对应的帖子,还是要特别感谢一下例子的提供作者。

1、我是按照原文思路实验的,过程如下:

1.1、用某一文件的一个域替换另一个文件中的的特定域

  1. # cat s
  2. root:XXXXXXXXXXXXXXX.:14995:0:99999:7:::
  3. oracle:YYYYYYYYYYYYYYYY:14984:0:99999:7:::

  4. # cat p
  5. root:x:0:0:root:/root:/bin/bash
  6. oracle:x:500:501::/home/oracle:/bin/bash
预期结果:

  1. root:XXXXXXXXXXXXXXX.:0:0:root:/root:/bin/bash
  2. oracle: YYYYYYYYYYYYYYYY:500:501::/home/oracle:/bin/bash
命令

  1. # 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 合并

  1. # cat file1
  2. 0011AAA 200.00 20050321
  3. 0012BBB 300.00 20050621
  4. 0013DDD 400.00 20050622
  5. 0014FFF 500.00 20050401
  6. 0011AAA 200.00 20050321 11111
  7. 0012BBB 300.00 20050621 22222
  8. 0013DDD 400.00 20050622 66666
  9. 0014FFF 500.00 20050401 55555

  10. # cat file2
  11. I0011 11111
  12. I0012 22222
  13. I0014 55555
  14. I0013 66666
预期结果

  1. 0011AAA 200.00 20050321 11111
  2. 0012BBB 300.00 20050621 22222
  3. 0013DDD 400.00 20050622 66666
  4. 0014FFF 500.00 20050401 55555
  5. 0011AAA 200.00 20050321 11111 11111
  6. 0012BBB 300.00 20050621 22222 22222
  7. 0013DDD 400.00 20050622 66666 66666
  8. 0014FFF 500.00 20050401 55555 55555

命令:(以下两种都可以)

  1. # awk 'NR==FNR{a[substr($1,2,5)]=$2} NR>FNR{print $0" "a[substr($1,1,4)]}' file2 file1
  1. # awk 'NR==FNR{a[b=substr($1,2,5)]=$2} NR>FNR{print $0" "a[b]}' file2 file1
命令虽然和原文的有些出入,但是结果都是一样的。想到了就要实验一下,以验证自己的理解。


2、内置变量汇总:

  1. NR:已经读取的记录条数
  2. FNR:正在读取的文件中已经读取的记录条数
  3. ARGIND:文件所在参数列表的位置
  4. ARGC:命令行参数的个数
  5. ARGV:命令行参数数组
  6. FS:用于指定记录域分隔符
  7. OFS:用于指定输出记录域分割符
  8. NF:记录域的个数
  9. ORS:记录的分隔符

还有三个例子没有实验,这里就先不引用了。等学习了,再分享过来。

参考资料:

http://hi.baidu.com/ptf_phoenix/blog/item/855a51c77da472dad0006052.html
上一篇:awk 实例记录
下一篇:awk 实用操作记录 求和 求平均数