awk实例

270阅读 0评论2015-12-15 sync_1521
分类:LINUX

题目:
  1. 文件 nk.txt如下
  2. 123
  3. 456
  4. 7890
  5. ...
  6. 文件 com.txt 如下
  7. AS673 02972   0000000170015612AI123 50134   0000001674815617YU766301347   0000000167481561RT789002972   0000000017001561...

  8. 生成的新文件n_com.t如下:
  9. AI123 50134   0000001674815617RT789002972   0000000017001561

  10. 文件nk.txt中数据无重复,长度为3位或4位。文件com.txt中所有数据为一行,第1位到30位为一组数据,每组数据中第3到第6位(不满4位以空格占位)如果有同nk.txt文件中相同的数据,则输出到新文件n_com.txt。
  11. 新文件中还是每30个字符为一组,所有数据还是为一行

我的解法:
  1. awk -F "" 'function out(m){s=substr(m,3,4);sub(" *$","",s);if(s in a){printf m}}NR==FNR{a[$0];next}{for(i=1;i<=NF;i++){if(i%30==1){out(m);m=$i}else{m=m$i}}}END{out(m)}' nk.txt com.txt
复制代码
大神解法:
  1. awk 'NR==FNR{a[substr($0" ",1,4)]++;next}(substr($0,3,4) in a){printf $0}END{print ""}' nk.txt <(grep -Eo '.{30}' com.txt)
复制代码

精妙在于<()的用法,可以把里面的命令当成一个文件
上一篇:if表达式
下一篇:wget命令