免费注册 查看新帖 |

Chinaunix

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

[文本处理] 怎么对多个文件进行匹配 [复制链接]

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-12-27 22:29 |只看该作者 |倒序浏览
本帖最后由 huang6894 于 2013-12-28 00:26 编辑

求大大指教一下:
如果手头上有三个文件的话:
1、ref.txt
  1. FCC36J1ACXX:1:1101:13880:10344#GATTAGTG/1       90      78      89      iPE-3+  34      0       11      12      2
  2. FCC36J1ACXX:1:1101:1346:13037#GATTAGTG/1        90      79      89      iPE-3+  34      0       10      11      2
复制代码
2、all.txt
  1. @FCC36J1ACXX:1:1101:13880:10344#GATTAGTG/1
  2. GTGCNACATCTTAACCTCAAGCACAGGAAGCAGTATAAAATCTGTCTCTTATACACATCTCTGAGCGGGCTGGCAAGGCAGACCGGGAGG
  3. +
  4. Z^_cBQ\`bcccedd[efg`edfgd_defhchhbbbffghbf[cO^^_e`gghhaace_fgdcfcb`gdcb``ab_^aaa^aXQXRTXX[
  5. @FCC36J1ACXX:1:1101:1250:2201#GGAGGAAG/1
  6. GGGGACGAGACCTCAACTCGGTTTTAAATTTATTTATTTTTTATAAATAATAGTTGTACATATTTGGGGCTGTCTCTTATACACATCTCT
  7. +
  8. bbbeeeeegggggiiiiiihifghiiiiiiihiiifhiiiiifghhfe____ecghgfhigggggggeecccccccccccccdccccccd
复制代码
3、do.txt
  1. GCNACATCTT
  2. ATAAAATCTGTCTCT
  3. GACGAGACCTCA
复制代码
我现在想对ref.txt建立哈希,第一列是key值,value是第七列和第八列的值,这两个值是第二个文件all.txt对应key值所在段(每四行为一段,每段第一行是key值)的第二行的起始和末尾,比如在ref.txt中key值FCC36J1ACXX:1:1101:13880:10344#GATTAGTG/1对应的数值是 0和11,我们就在第二个文件all.txt中找到对应key段,然后匹配该段的第二行的第一位到十二位的字符 也就是GTGCNACATCTT。我们得到这串字符后去匹配第三个文件do.txt,匹配第三个文件的每一行是否存在于这一串字符串上,如果存在,那么输出第二个文件的这一段,比如上面的文件最后是输出
  1. @FCC36J1ACXX:1:1101:13880:10344#GATTAGTG/1
  2. GTGCNACATCTTAACCTCAAGCACAGGAAGCAGTATAAAATCTGTCTCTTATACACATCTCTGAGCGGGCTGGCAAGGCAGACCGGGAGG
  3. +
  4. Z^_cBQ\`bcccedd[efg`edfgd_defhchhbbbffghbf[cO^^_e`gghhaace_fgdcfcb`gdcb``ab_^aaa^aXQXRTXX[
复制代码
如果多个重复就输出多次~

请问这样实现是不是比较难呀?求助求助`

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
2 [报告]
发表于 2013-12-28 00:55 |只看该作者
本帖最后由 yestreenstars 于 2013-12-28 13:39 编辑
  1. awk 'ARGIND==1{a["@"$1]=$7" "$8}ARGIND==2{if(/@/){t=$0;s[t]=$0;if(a[$1])k=1;next}if(k){split(a[t],b);m[t]=substr($0,b[1]+1,b[2]-b[1]+1);k=0}s[t]=s[t]"\n"$0}ARGIND==3{for(i in m)if(m[i]~$0)print s[i]}' ref.txt all.txt do.txt
复制代码

论坛徽章:
29
程序设计版块每日发帖之星
日期:2016-02-29 06:20:0015-16赛季CBA联赛之天津
日期:2016-08-10 10:33:1115-16赛季CBA联赛之深圳
日期:2016-08-17 15:07:2015-16赛季CBA联赛之佛山
日期:2016-11-07 11:33:5015-16赛季CBA联赛之广夏
日期:2016-11-15 09:13:31CU十四周年纪念徽章
日期:2016-11-24 14:12:25极客徽章
日期:2016-12-07 14:03:4015-16赛季CBA联赛之深圳
日期:2016-12-07 17:15:2715-16赛季CBA联赛之北京
日期:2016-12-22 09:30:0115-16赛季CBA联赛之深圳
日期:2016-12-22 10:49:2115-16赛季CBA联赛之山西
日期:2017-02-10 09:05:3215-16赛季CBA联赛之同曦
日期:2017-02-27 14:19:08
3 [报告]
发表于 2013-12-28 11:17 |只看该作者
本帖最后由 elu_ligao 于 2013-12-28 11:17 编辑
  1. awk '1==ARGIND{a[$1]=$0;next}2==ARGIND{for(i in a)if(index($0,i)){getline s;b[i]=s;break}}3==ARGIND{for(i in b){split(a[i],idx);if(index(substr(b[i],idx[7],idx[8]-idx[7]+1),$0))print a[i]}}' 1.txt 2.txt 3.txt
复制代码

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
4 [报告]
发表于 2013-12-28 11:37 |只看该作者
回复 2# yestreenstars


    谢谢大大,大大辛苦了~

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
5 [报告]
发表于 2013-12-28 11:37 |只看该作者
回复 3# elu_ligao


    谢谢,谢谢你

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
6 [报告]
发表于 2013-12-28 12:28 |只看该作者
回复 2# yestreenstars


    大大,我试图修改你的脚本的时候,发现,如果我的需求是
    “我们得到字符后去匹配第三个文件do.txt,匹配这一串字符串是否存在第三个文件的某一行的开始或者结尾,如果存在,那么输出第二个文件的这一段
    然后我第三个文件改为:
  1. TTACGCGTGCNACATCTT
  2. GTGCNACATCTTATAAAATCTGTCTCT
  3. GACGAGGTGCNACATCTTACCTCA
复制代码
我先得到结果:
  1. @FCC36J1ACXX:1:1101:13880:10344#GATTAGTG/1
  2. GTGCNACATCTTAACCTCAAGCACAGGAAGCAGTATAAAATCTGTCTCTTATACACATCTCTGAGCGGGCTGGCAAGGCAGACCGGGAGG
  3. +
  4. Z^_cBQ\`bcccedd[efg`edfgd_defhchhbbbffghbf[cO^^_e`gghhaace_fgdcfcb`gdcb``ab_^aaa^aXQXRTXX[
  5. @FCC36J1ACXX:1:1101:13880:10344#GATTAGTG/1
  6. GTGCNACATCTTAACCTCAAGCACAGGAAGCAGTATAAAATCTGTCTCTTATACACATCTCTGAGCGGGCTGGCAAGGCAGACCGGGAGG
  7. +
  8. Z^_cBQ\`bcccedd[efg`edfgd_defhchhbbbffghbf[cO^^_e`gghhaace_fgdcfcb`gdcb``ab_^aaa^aXQXRTXX[
复制代码
似乎改成if($0~/^m/||$0~/m$/)print s}这样不可行啊?怎么破呢?

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
7 [报告]
发表于 2013-12-28 12:37 |只看该作者
本帖最后由 blackold 于 2013-12-28 14:01 编辑

try:
  1. $ awk 'ARGIND==1{d[$1];next}ARGIND==2{s[$1]=$7+1;e[$1]=$8-$7+1;next}FNR>1&&$1 in s{k=substr($2,s[$1],e[$1]);for(i in d)if(i~"^"k||i~k"$") print "@"$0}' do.txt ref.txt RS="^@|\n@" FS="\n" all.txt
复制代码
substr 用错了,已修正。

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
8 [报告]
发表于 2013-12-28 13:29 |只看该作者
本帖最后由 yestreenstars 于 2013-12-28 13:30 编辑

回复 6# huang6894
  1. 将m[i]~$0改成$0~"^"m[i]||$0~m[i]"$"
复制代码

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
9 [报告]
发表于 2013-12-28 14:15 |只看该作者
本帖最后由 yestreenstars 于 2013-12-28 14:16 编辑

回复 7# blackold
黑哥,substr这里貌似有问题吧,substr函数的第二个参数表示起始位置,第三个参数表示长度,而不是终止位置。
假如我要匹配的是第3位到第5位,应该用substr($0,3,3),而不是substr($0,3,5)。
这里是因为楼主的那两个位置刚好是从1开始的,所以不会出错。
  1. [root@localhost test1]# awk 'BEGIN{print substr("123456789",3,5)}'
  2. 34567
  3. [root@localhost test1]# awk 'BEGIN{print substr("123456789",3,3)}'
  4. 345
  5. [root@localhost test1]#
复制代码
       substr(s, i [, n])      Returns  the at most n-character substring of s
                                    starting at i.  If n is omitted, the rest of  s
                                    is used.

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
10 [报告]
发表于 2013-12-28 14:17 |只看该作者
回复 9# yestreenstars


    已经修正了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP