一种可能性是使用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 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 %
对于 sample File1
,sed
处理的输出将是:
>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
但是,您应该在使用该符号之前验证脚本。