我一直在寻找几天,但我没有得到正确的答案
我有两个看起来像这样的文件:
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
的一种方式,但我找不到解决方案
提前致谢!
答案 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
对于示例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 %
对于示例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
可能会在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生成中间文件或流,其中有一个额外的空行,以便两个文件中的两行匹配。
希望这有帮助。