免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2827 | 回复: 7
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(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
2 [报告]
发表于 2019-01-08 17:21 |只看该作者
还望各位路过的大神相助,小妹这厢有礼了~|~

论坛徽章:
10
15-16赛季CBA联赛之同曦
日期:2016-06-11 19:22:4115-16赛季CBA联赛之深圳
日期:2020-05-31 16:13:5615-16赛季CBA联赛之同曦
日期:2020-01-28 12:42:47每日论坛发贴之星
日期:2016-08-09 06:20:00程序设计版块每日发帖之星
日期:2016-08-09 06:20:00每日论坛发贴之星
日期:2016-07-12 06:20:00程序设计版块每日发帖之星
日期:2016-07-12 06:20:00程序设计版块每日发帖之星
日期:2016-07-06 06:20:00程序设计版块每日发帖之星
日期:2016-07-04 06:20:0015-16赛季CBA联赛之佛山
日期:2021-02-26 09:33:41
3 [报告]
发表于 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
4 [报告]
发表于 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

微信截图_20190109165256.png (20.09 KB, 下载次数: 105)

a.txt

a.txt

微信截图_20190109165729.png (29.84 KB, 下载次数: 99)

b.txt

b.txt

微信截图_20190109171349.png (67.28 KB, 下载次数: 103)

结果

结果

论坛徽章:
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
5 [报告]
发表于 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
6 [报告]
发表于 2019-02-13 13:55 |只看该作者
本帖最后由 expert1 于 2019-02-13 13:56 编辑

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

论坛徽章:
0
7 [报告]
发表于 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
8 [报告]
发表于 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
我现在的水平就是去套别人的脚本,没有系统的学过,一点点也不会编,非常感谢您的帮助

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP