2013-04-17 81 views
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 

我想用名字來代替線(>重疊羣。 ..長度...)在File1中與名稱在File2中的行。請注意,File2僅包含重疊羣名稱(無序列)。

我想那裏有一個方法與sed,但我不能找到解決辦法

提前感謝!

+0

歡迎來到Stack Overflow。請儘快閱讀[常見問題]。大概在File2中有多少行(幾十或幾百,幾千,幾百萬)?據推測,其目的是用'contig-100_23331_Cov:_30.9135'等替換'contig-100_23331'等。 –

+0

File2有23335行。 – Ramirous

+0

事實上,我需要用contig-100_23331_Cov:_30.9135替換contig-100_23331,依此類推。 – Ramirous

回答

2

一種可能性是使用sed創建從一個File2 -script 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 % 

對於樣品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 

但是,你應該使用符號之前驗證腳本。

+0

非常感謝Jonathan!最後一個命令完成了這項工作。這需要一段時間,但工作得很好。 – Ramirous

0

免責聲明:從來沒有這樣做...

您可能需要使用join命令合併文件merging files

您可能需要生產用於FILE2中介文件或流,其有一個額外的空這樣兩行文件中的兩行匹配。

希望這會有所幫助。

+0

不幸的是,'join'不太可能成爲解決方案。數據行('TCAG ...')不會用'join'輕鬆處理,並且數據文件必須按排序順序排列。 –

相關問題