我已经搜寻了几天,但没有得到正确的答案

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

文件1:

>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中具有名称的行替换File1中具有名称(> contig ... length ...)的行。 请注意,File2仅包含重叠群名称(无序列)。

我想sed有办法,但我找不到解决方法

提前致谢!

===============>>#1 票数:2 已采纳

一种可能性是使用sedFile2创建一个sed -script,然后在File1使用它:

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

对于样本File2 ,该sed.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可能有23K线路中的问题sed脚本。 如果这对您来说是个问题,则可以生成sed.script ,然后将其拆分( split )成较小的块(例如,每行1000行),然后为每个sed -f chunk运行sed -f chunk 那是痛苦的,但有必要。 从历史上看,HP-UX(传统版本,如HP-UX 9或10)具有sed有限版本,它只能处理sed脚本中的几百个命令。

假设您使用的是bash ,则可以避免使用进程替换的显式中间文件:

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

但是,您应该在使用该符号之前验证脚本。

===============>>#2 票数:0

免责声明:从来没有做过...

您可能要使用join命令来合并文件合并文件

您可能必须为FILE2生成一个中间文件或流,该文件或流具有多余的空行,以便两个文件中的两行都匹配。

希望这可以帮助。

  ask by Ramirous translate from so

未解决问题?本站智能推荐: