用第二个文件中的字符串替换一个文件中的字符串

时间:2013-04-17 22:10:04

标签: string bash search replace

我一直在寻找几天,但我没有得到正确的答案

我有两个看起来像这样的文件:

File1中:

>contig-100_23331 length_200 read_count_4043 
TCAG...
>contig-100_23332 length_200 read_count_4508 
TTCA...
>contig-100_23333 length_200 read_count_184 
TTCC...

文件2:

>contig-100_23331_Cov:_30.9135
>contig-100_23332_Cov:_125.591
>contig-100_23333_Cov:_5.97537

我想用File2中名称(> contig ... length ...)替换名称为File2的行。请注意,File2仅包含重叠群名称(无序列)。

我认为这是sed的一种方式,但我找不到解决方案

提前致谢!

2 个答案:

答案 0 :(得分:2)

一种可能性是使用sed创建sed - 来自File2的脚本,然后在File1上使用:

sed 's/^\(>contig-[0-9]*_[0-9]*\)_.*/s%^\1 %& %/' File2 > sed.script
sed -f sed.script File1 > File.Out
rm -f sed.script

对于示例File2sed.script将包含:

s%^>contig-100_23331 %>contig-100_23331_Cov:_30.9135 %
s%^>contig-100_23332 %>contig-100_23332_Cov:_125.591 %
s%^>contig-100_23333 %>contig-100_23333_Cov:_5.97537 %

对于示例File1sed处理的输出将为:

>contig-100_23331_Cov:_30.9135 length_200 read_count_4043 
TCAG...
>contig-100_23332_Cov:_125.591 length_200 read_count_4508 
TTCA...
>contig-100_23333_Cov:_5.97537 length_200 read_count_184 
TTCC...

某些版本的sed可能会在sed脚本中出现23k行问题。如果这对您来说是个问题,那么您可以生成sed.script然后将其(split)拆分为更小的块(例如每行1000行),然后为每个块运行sed -f chunk 。这很痛苦,但很有必要。从历史上看,HP-UX(旧版本,如HP-UX 9或10)具有相当有限的sed版本,只能处理sed脚本中的几百个命令。

鉴于您使用的是bash,您可以使用process substitution来避免显式中间文件:

sed -f <(sed 's/^\(>contig-[0-9]*_[0-9]*\)_.*/s%^\1 %& %/' File2) File1 > File.Out

但是,您应该在使用该表示法之前验证脚本。

答案 1 :(得分:0)

免责声明:从未这样做过......

您可能希望使用join命令合并文件merging files

您可能必须为FILE2生成中间文件或流,其中有一个额外的空行,以便两个文件中的两行匹配。

希望这有帮助。