awk内建变量
awk操作A和B两个文件,这两个文件是用来计算TF-IDF的,A文件记录了词频,B文件记录了每个词在文档中出现的次数,现在要对A、B两个文件进行合并。总共有502条记录,这里只展现了部分,大家可以自己做实验。testawk文件记为A,testnum文件记为B。
A文件有四列,B文件有两列。A文件的第三列和B文件的第一列相同,但B多一个字段瑜伽。
使用的awk命令合并AB文件及解释如下:
awk '{if(NR==FNR){a[$3]=$0;} else{a[$2]=a[$2]"\t"$1}} END{for(i in a){print a[i]}}' t2 t2uniq_sort_tab > merge_t2
A、B两个文件合并后的效果:
--解释:NR表示读取的所有记录行数,FNR表示该文件内记录的函数,所以当NR=FNR时,说明在读取第一个文件;当NR>FNR时,也就是不等于时,表示在读取第二个文件。
a是一个数组,用来存放合并后的记录,a的索引是两个文档中有关系的列,即合并条件列。所以这条命令就可以解释为当第一个文档的第三列的值存储第一个文档整行记录,当读取第二个文档时,由于A文档的$3=B文档的$2,所以可以将B文档的需要的值即第一列的值添加到该记录内,由此A文档和B文档的符合条件的记录得到了合并。
问题:A、B合并后的文件中有一个45,这个记录是属于B文件的“瑜伽”这个词,如何以A为准合并文件呢?
如果B文件中的x字段在A文件中没有,合并后的结果中是有x字段的,即合并了不在A文档中的字段。要想实现去除A中不存在的字段,方法是加一个判断。
awk '{if(NR==FNR)a[$3]=$0;else{for(x in a){if(x==$1)a[$1]=a[$1]"\t"$2;}}}END{for(i in a){print a[i];}}' testawk testnum
合并后的效果:
总结:只有真正动手操作,才会理解代码含义。只有真正理解代码含义,才能自如的去修改,以达到自己想要的效果