1

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

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

文件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 仅包含 contig 名称(无序列)。

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

提前致谢!

4

2 回答 2

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

对于 sample 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 %

对于 sample 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为每个块运行。这很痛苦,但很有必要。从历史上看,HP-UX(过时的版本,如 HP-UX 9 或 10)的版本相当有限sed,只能处理sed脚本中的几百个命令。

鉴于您正在使用,您可以使用进程替换bash来避免显式中间文件:

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

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

于 2013-04-17T22:26:14.413 回答
0

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

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

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

希望这可以帮助。

于 2013-04-17T22:19:50.720 回答