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

Posted

技术标签:

【中文标题】查找和替换文件中与另一个文件中的字符串匹配的子字符串【英文标题】:find and replace substrings in a file which match strings in another file 【发布时间】:2020-03-25 12:03:21 【问题描述】:

我有两个 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仅包含读取名称和坐标。文件1中的所有读取名称和坐标都存在于文件2中,但 file2 也可能包含具有不同坐标的相同读取名称。此外,file2 包含 file1 中不存在的读取名称。

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

Read SRR6691737.359236 11999 12313; Dup 277

到:

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

有什么帮助吗?

【问题讨论】:

欢迎来到SO,不清楚。您能否提供输入样本和预期输出样本以及您的努力,然后让我们知道。 请发布您已经尝试过的内容 问题令人费解且不一致。请提供更多重复的样本输入和相应的输出。文件描述和字段分隔符与 TSV 文件不一致。请改进解释。 【参考方案1】:

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

你写:

我有两个 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、宝瓦2 11、正弦波 12,1 13,260 14,9

那好像有 14 列,你指定 9 列...

您能否编辑您的问题并明确说明这一点? 即指定为 csv SRR6691737.359236/0_14228//11999_12313,Censor,repeat,5,.....

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

    SRR6691737.359236/0_14228//11999_12313 审查员 5 264 1169 + . 重复 BOVA2 SINE 1 260 9

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

    CM011822.1 冷藏 距离 63738705 63738727 + . 读SRR6691737.359236 11999 12313 重复 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 ?,并根据需要更改脚本。

【讨论】:

为了清楚起见,我把列的 csv 格式: file1: SRR6691737.359236/0_14228//11999_12313 ;审查员;重复 ; 5; 264;第1169章+ ; . ;重复 BOVA2 SINE 1 260 9 文件 2:CM011822.1;冷藏车;不和谐; 63738705; 63738727; . ; + ; . ;阅读SRR6691737.359236 11999 12313; Dup 277 我没有任何编码经验,但想将 file2 更改为:CM011822.1;冷藏车;不和谐; 63738705; 63738727; . ; + ; . ;读取SRR6691737.359236/0_14228//11999_12313;重复 277 。我的意思是,脚本从 file1 中找到匹配的文件名并修改 file2 @ManiGhanipoorSamami:你的问题不清楚。我添加了信息/问题,应该清楚地表明这个问题“不好”。缺少信息,无法给出答案。 SO 不是为了提供解决方案,而是为了帮助他人创建自己的解决方案。 ? 我不想将 file1 转换为 file2。我想将 file2 的第 8 个字段从“读取 SRR6691737.359236 11999 12313”更改为“读取 SRR6691737.359236/0_14228//11999_12313”。 file2 的其他字段保持不变。对于我展示的 file2 的第一行,我需要一个脚本,在 file1 中找到“SRR6691737.359236”和“11999_12313”匹配项,并将“0_14228”从 file1 添加到 file2 的第 8 列,格式如下:“Read SRR6691737. 359236/0_14228//11999_12313"。 感谢@LUUK,您的脚本生成了这个输出(生成了几十个):“1 SRR6691737.359236 11999 12313 .... SRR6691737.359236/0_14228//11999_12313”,但我想要输出采用这种格式:“CM011822.1;冷藏;不一致;63738705;63738727;.;+;..;阅读 SRR6691737.359236/0_14228//11999_12313;Dup 277”(我希望它是 tsv,我将其设为 csv在这里使单独的列清晰)。 IE。我只想更改 file2 的第 9 列。我正在学习 awk,但很快就需要这个结果,如果你能帮我解决这个问题,我将不胜感激。 I am learning awk,请阅读:***.com/questions/20844666/…

以上是关于查找和替换文件中与另一个文件中的字符串匹配的子字符串的主要内容,如果未能解决你的问题,请参考以下文章

计算文件中与 String [ ] 中的单词匹配的单词

查找一个字符串是不是与另一个字符串匹配

我们如何在匹配两个文本文件时查找和替换单词?

查找与模式匹配的文件,替换字符串,然后将输出与原始文件进行比较,命令失败

linux几种常见的文件内容查找和替换命令

C语言中如何用一个字符串替换一个主串中的子串