免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1490 | 回复: 7

[文本处理] awk比较两文本文件 [复制链接]

论坛徽章:
0
发表于 2019-01-08 17:18 |显示全部楼层
用awk比较两文件,当第一列相等且文件2第二列的数值位于文件1的第三列和第四列的数值之间时,打印文件2整行,如下面的数据,请问怎么做到呢?

文件a.txt:

chr2 intron 12 70 -

chr2 intron 80 100 -

chr2 intron 156 173 -

文件b.txt:

chr2 cds 13 -

chr2 cds 81 -

chr2 cds 143 -

我想得到这样的结果:

chr2 cds 13

chr2 cds 81

我自己琢磨了好久编出来的程序:awk -F " " 'NR==FNR[a1[$1]=$1;a2[$1]=$2;a3[$1]=$3;a4[$1]=$4;next}NR>FNR{if ($3>a3[$1]&&$3<a4[$1]&&$1=a1[$1]) print $0}}' a.txt b.txt,输不出结果,不知道问题出在哪里,急死

论坛徽章:
0
发表于 2019-01-08 17:21 |显示全部楼层
还望各位路过的大神相助,小妹这厢有礼了~|~

论坛徽章:
7
15-16赛季CBA联赛之同曦
日期:2016-06-11 19:22:41程序设计版块每日发帖之星
日期:2016-07-04 06:20:00程序设计版块每日发帖之星
日期:2016-07-06 06:20:00程序设计版块每日发帖之星
日期:2016-07-12 06:20:00每日论坛发贴之星
日期:2016-07-12 06:20:00程序设计版块每日发帖之星
日期:2016-08-09 06:20:00每日论坛发贴之星
日期:2016-08-09 06:20:00
发表于 2019-01-09 10:16 |显示全部楼层
awk 'NR==FNR{a[FNR]=$1;b[FNR]=$3;c[FNR]=$4}NR!=FNR{if(a[FNR]==$1&&$
3<=c[FNR]&&$3>=b[FNR])print $0}'  file1 file2

论坛徽章:
0
发表于 2019-01-10 10:52 |显示全部楼层
非常感谢您的回复,可是结果还是会忽略掉能匹配到的位置,可能我问题描述不够详细,我是想从a.txt(图1)中挑选落在b.txt(图2)文件中基因上的位点,输出的结果如图3。
file:///C:/Users/%E8%B4%BA%E8%B6%85/AppData/Local/Temp/msohtmlclip1/01/clip_image006.gif

a.txt

a.txt

b.txt

b.txt

结果

结果

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
发表于 2019-02-13 13:55 |显示全部楼层
回复 1# hechao7021

  1. awk 'NR==FNR{

  2. a[$0]=$3 }NR>FNR {


  3. for ( i in a) {


  4. split(i,m," ")


  5. if( m[1] == $1 && m[3] >$3 && m[3] < $4)

  6. print m[1],m[2],m[3]

  7. }



  8. }' b a
复制代码
你的问题是key重复了。读a.txt的时候,key都是chr2,结果array只有最后一个 chr2 intron 156 173 -

评分

参与人数 1信誉积分 +5 收起 理由
hechao7021 + 5 很给力!

查看全部评分

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
发表于 2019-02-13 13:55 |显示全部楼层
本帖最后由 expert1 于 2019-02-13 13:56 编辑

3楼的问题是,如果2个文件内容乱了一下,结果就不对了,
必须用for 循环,2个文件逐行来比较。

论坛徽章:
0
发表于 2019-02-20 11:09 |显示全部楼层
回复 5# expert1

您的代码更简单,很给力,我自己逛论坛,模仿别人的代码写了一个:awk -vP=1 'FNR==NR{{C=++c[$1];a[$1,C]=$1;s[$1,C]=$2;e[$1,C]=$3;f[$1,C]=$0}next}{C=c[$1];if(C)for(n=1;n<=C;n++){if(a[$1,n]=$1&&s[$1,n]<=$2&&$2<=e[$1,n]){m=f[$1,n];n=C;if(P)print $0" "m}}}END{print m}' b.txt a.txt >c.txt
我现在的水平就是去套别人的脚本,没有系统的学过,一点点也不会编,非常感谢您的帮助

论坛徽章:
0
发表于 2019-02-20 11:09 |显示全部楼层
回复 5# expert1

您的代码更简单,很给力,我自己逛论坛,模仿别人的代码写了一个:awk -vP=1 'FNR==NR{{C=++c[$1];a[$1,C]=$1;s[$1,C]=$2;e[$1,C]=$3;f[$1,C]=$0}next}{C=c[$1];if(C)for(n=1;n<=C;n++){if(a[$1,n]=$1&&s[$1,n]<=$2&&$2<=e[$1,n]){m=f[$1,n];n=C;if(P)print $0" "m}}}END{print m}' b.txt a.txt >c.txt
我现在的水平就是去套别人的脚本,没有系统的学过,一点点也不会编,非常感谢您的帮助

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,8.5折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时8.5折扣期:2019年9月30日前


----------------------------------------

大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP