美文网首页计算机@linux_python_R 技术帖
使用awk按某一属性合并两个文件

使用awk按某一属性合并两个文件

作者: 蕙瑜爱 | 来源:发表于2018-04-04 17:24 被阅读0次

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两个文件合并后的效果:

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

合并后的效果:

以A为准的合并效果

总结:只有真正动手操作,才会理解代码含义。只有真正理解代码含义,才能自如的去修改,以达到自己想要的效果

相关文章

  • 使用awk按某一属性合并两个文件

    awk内建变量 awk操作A和B两个文件,这两个文件是用来计算TF-IDF的,A文件记录了词频,B文件记录了每个词...

  • 常用命令(持续更新)

    处理文本常用单行命令,持续更新~1.awk 匹配两个文件内容### Linux Shell中使用awk完成两个文件...

  • awk

    请使用awk命令将如下两份文件中名字相同的两行合并起来

  • join

    按两个文件的相同字段合并。

  • awk合并文件

    一个awk由三个部分组成:BEGIN语句块、END语句块和能够使用模式匹配的通用语句块。 这三个部分是可选的,任何...

  • Shell中使用awk按列求和

    参考:Shell中如何按列求和? 使用awk按列求和

  • 常用Linux命令

    服务器常用 文件合并、去重、拆分 解释下 awk '!a[$0]++' file:https://blog.csd...

  • 文件操作

    一、文件操作-读 二、文件操作-写 三、复制文件 四、合并文件 合并文件-结果 五、readline按行读取文件、...

  • awk命令的使用

    awk命令的使用 awk命令格式awk '条件1{动作1} 条件2{动作2}…' 文件名 在介绍awk命令的用法前...

  • jdk8使用stream实现两个list集合合并成一个(对象属性

    java使用stream实现list中对象属性的合并:根据两个List中的某个相同字段合并成一条List,包含两个...

网友评论

    本文标题:使用awk按某一属性合并两个文件

    本文链接:https://www.haomeiwen.com/subject/duqlhftx.html