- 论坛徽章:
- 0
|
本帖最后由 jzsjm1002 于 2019-02-17 20:59 编辑
整体思路是根据正则匹配 替换
楼主 A文件的数据量太少
GAG_reina在前,即为Gypsy 没有给出其他条件 是特定 _del的嘛
测试发现 A文件里第3列有空格 需要替换掉 楼主需要自行替换或者用sed vim等
- #!/bin/bash
- #
- path1=/mnt/a
- path2=/mnt/b
- count=`grep -c "" $path2`
- a1=(`sed -r 's#([^/]*)(/)#\1_.+\2.*#g;s/[[:space:]]+/:/;s/:/_.+.*&/' $path2`)
- #生成a1数组 并重组字符串成正则表达式
- for x in `seq 0 $(($count-1))`;do
- awk --re-interval -v a1=${a1[$x]} '
- function pr1(p1,p2,p3,p4,p5, z){
- if(p5){
- if($3~/(.*\/[^/]+_del\/?.*){5}/){
- z=gensub(/.*\/([^/]+_del\/).*\/([^/]+_del\/).*\/([^/]+_del\/).*\/([^/]+_del\/).*\/([^/]+_del)\/?.*/,"\\1\\2\\3\\4\\5","1",$3)
- #匹配成功 并替换字符串 赋值给z
- print p1,p2,p3"\n"p4"\n"z
- }
- else
- print p1,p2,p3"\n"p4"\n"
- }
- else
- printf("%s %d %s\n%s\n",p1,p2,p3,p4)
- }
- #定义一个pr1函数 来做打印 当匹配到reina字符串 进行判断
- BEGIN{split(a1,a,":")}{
- if($3~a[1]){
- r=0 #每一行都将 r设置为0 当匹配到reina时 =1
- split($3,b,"/") #将第3列切成数组
- for(c in b){ #下标循环
- d=gensub(/[^_]+_(.+)/,"\\1","1",b[c]) #字符串替换 例reina del galadriel...
- e=gensub(/\.\+/,d,"g",a[1]) #将下标进行字符串重组成正则
- if($3~e) f[e]++ #匹配成功 数组f[e] +1
- if(f[e]==5){ #当f[e]=5
- g=gensub(/\.\*/,"","g",e) #将.*替换成为空
- if(match(g,"reina")) r=1 #匹配reina 匹配成功 r=1
- if(match(g,"del")) #匹配del 匹配r=0 跳出循环
- if(r==0) continue
- print pr1($1,$2,a[2],g,r) #调用pr1函数
- f[e]=0
- }
- }
- }
- }' $path1
- done
- #在a1数组里做循环 例 GAG_.+/.*AP_.+/.*RT_.+/.*RNaseH_.+/.*INT_.+.*:Gypsy
复制代码
- root@vh10:/mnt# ./test.sh
- Chr01_13708617_13713687 5071 Gypsy
- GAG_reina/AP_reina/RT_reina/RNaseH_reina/INT_reina
- GAG_del/AP_del/INT_del/RT_del/RNaseH_del
- Chr01_9654239_9660689 645 Copia
- GAG_copia/AP_copia/INT_copia/RT_copia/RNaseH_copia
- Chr01_13549455_13553995 4541 Copia
- GAG_oryco/AP_oryco/INT_oryco/RT_oryco/RNaseH_oryco
- Chr01_13578874_13583841 4968 Copia
- GAG_retrofit/AP_retrofit/INT_retrofit/RT_retrofit/RNaseH_retrofit
- #执行结果
复制代码
|
|