Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 将一个文件中的字符串替换为第二个文件中的字符串_String_Bash_Search_Replace - Fatal编程技术网

String 将一个文件中的字符串替换为第二个文件中的字符串

String 将一个文件中的字符串替换为第二个文件中的字符串,string,bash,search,replace,String,Bash,Search,Replace,我已经找了几天了,但我没有找到正确的答案 我有两个文件如下所示: 文件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 &g

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

我有两个文件如下所示:

文件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
我想用File1中的名称(>contig…length…)替换File2中的名称行。请注意,文件2仅包含重叠名称(无序列)

我想有一种方法可以使用
sed
,但我找不到解决方案


提前谢谢

免责声明:从未这样做过

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

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


希望这有帮助。

一种可能性是使用
sed
File2
创建
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
对于示例
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
,然后将其()拆分为更小的块(例如,每个块1000行),然后为每个块运行
sed-f chunk
。这很痛苦,但也是必要的。历史上,HP-UX(老式版本,如HP-UX 9或10)的
sed
版本相当有限,只能处理
sed
脚本中的几百条命令

鉴于您使用的是
bash
,您可以通过以下方式避免显式的中间文件:

sed-f文件.Out

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

欢迎使用堆栈溢出。请尽快阅读这篇文章。File2中大约有多少行(数十行或数百行、数千行、数百万行或更多)?大概是想用
contig-100\u 23331\u Cov:\u 30.9135
等替换
contig-100\u 23331
,等等。文件2有23335行。实际上,我需要用contig-100\u 23331\u Cov:\u 30.9135等替换contig-100\u 23331。不幸的是,
join
不太可能是解决方案。数据行(
TCAG…
)在使用
join
时根本不容易处理,数据文件必须按顺序排序。非常感谢Jonathan!最后一个命令完成了任务。这需要一段时间,但效果很好。
sed -f <(sed 's/^\(>contig-[0-9]*_[0-9]*\)_.*/s%^\1 %& %/' File2) File1 > File.Out