在文件中查找并替换与另一个文件中的字符串相匹配的子字符串

时间:2019-11-30 01:22:36

标签: bash awk replace grep find

我有两个txt文件: File1 是具有9列的tsv。以下是其第一行(SRR6691737.359236/0_14228//11999_12313是第一列,而Repeat是第9列):

SRR6691737.359236/0_14228//11999_12313  Censor  repeat  5       264     1169    +       .       Repeat BOVA2 SINE 1 260 9

File2 是具有9列的tsv。以下是其第一行(在“ Read”为第9列之后):

CM011822.1  reefer  discordance 63738705    63738727    .   +   .   Read SRR6691737.359236 11999 12313; Dup 277

文件1包含读取名称(SRR6691737.359236),读取长度(0_14228)和坐标(11999_12313)的信息,而文件2仅包含读取名称和坐标。 file1存在于file2中,但是file2也可能包含具有不同坐标的相同读取名称,而且file2包含file1中不存在的读取名称。

我想编写一个脚本,该脚本在file2中查找与file1中的名称和坐标相匹配的读取名称和坐标,并将读取长度从file1添加到file2。即更改file2的最后一列:

Read SRR6691737.359236 11999 12313; Dup 277

至:

Read SRR6691737.359236/0_14228//11999_12313; Dup 277

有什么帮助吗?

1 个答案:

答案 0 :(得分:0)

如果不清楚您的输入文件的外观。

您写:

  

我有两个txt文件: File1 是具有9列的tsv。以下是   它的第一行(SRR6691737.359236/0_14228//11999_12313是第一行   列,“重复”之后是第9列):

SRR6691737.359236/0_14228//11999_12313  Censor  repeat  5       264     1169    +       .       Repeat BOV, ancd A2 SINE 1 260 9

如果我尝试检查列(并将它们放在“列,值”对中): 列,值 1,SRR6691737.359236 / 0_14228 // 11999_12313 2,审查员 3,重复 4,5 5,264 6,1169 7+ 8, 9,重复 10,BOVA2 11,正弦 12,1 13,260 14,9

似乎有14列,您指定了9列...

您可以编辑您的问题,并对此清楚吗? 即指定为csv SRR6691737.359236/0_14228//11999_12313,Censor,repeat,5,.....

添加信息,反馈后: file1包含以下字段(用Tab-和ancd分隔):

  1. SRR6691737.359236 / 0_14228 // 11999_12313
  2. 检查器
  3. 5
  4. 264
  5. 1169
  6. +
  7. 重复BOVA2 SINE 1 260 9

您要将其(使用脚本)转换为制表符分隔的文件:

  1. CM011822.1
  2. 冷藏箱
  3. 距离
  4. 63738705
  5. 63738727
  6. +
  7. 阅读SRR6691737.359236 11999 12313
  8. Dup 277

需要更多信息来解决这个问题!

字段1:“ CM011822.1”的信息来自何处?

字段2和3:“冷藏箱” /“距离”。这些固定字段是否应该总是包含这些文本,还是有例外?

字段4和5:这些值(63738705; 63738727)来自哪里?

好吧,很显然,这里有更多的问题要问……

第二次更改...:

创建一个文件,名称为'mani.awk':

FILENAME=="file1"{
        split($1,a,"/");
        x=a[1] " " a[4];
        y=x; gsub(/_/," ",y);
        r[y]=$1;
        c=1; for (i in r) { print c++,i,"....",r[i]; }
}
FILENAME=="file2"{
        print "<--", $0, "--> " ;
        for (i in r) {
                if ($9 ~ i) {
                        print "B:" r[i];
                        split(r[i],b,"/");
                        $9="Read " r[i];
                        print "OK";
                        }
                };
        print "<--", $0, "--> " ;
}

在此之后,gawk -f mani.awk file1 file2将产生正确的结果。

如果没有,我建议您学习AWK?,并根据需要更改脚本。