【问题标题】:Replacing strings in one file with strings from second file用第二个文件中的字符串替换一个文件中的字符串
【发布时间】:2013-04-10 20:52:41
【问题描述】:

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

我有两个如下所示的文件:

文件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 有办法,但我找不到解决办法

提前致谢!

【问题讨论】:

  • 欢迎来到 Stack Overflow。请尽快阅读FAQ。 File2 中大约有多少行(数十或数百,数千,数百万,更多)?想必,本意是把contig-100_23331换成contig-100_23331_Cov:_30.9135等。
  • File2 有 23335 行。
  • 确实,我需要将 contig-100_23331 替换为 contig-100_23331_Cov:_30.9135,等等。

标签: string bash search replace


【解决方案1】:

一种可能性是使用sedFile2 创建一个sed 脚本,然后在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

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

【讨论】:

  • 非常感谢乔纳森!最后一个命令完成了工作。这需要一段时间,但效果很好。
【解决方案2】:

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

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

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

希望这会有所帮助。

【讨论】:

  • 不幸的是,join 不太可能成为解决方案。使用join 根本无法轻松处理数据行(TCAG...),并且数据文件必须按顺序排列。
猜你喜欢
  • 2011-07-01
  • 2019-03-21
  • 2013-05-18
  • 2019-12-07
  • 2018-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-31
相关资源
最近更新 更多