This is a test version of Biostars. For the public version, visit https://www.biostars.org.
Replace Nexus File Gene Names By Another Defintion Using Grep Awk Sed

Replace the Nexus file containing o387128170 by MJ respectively any suggestions The file1 is tab separated file and column one contains definitions, column two contains the respective names used in nexus file

FILE1

MJ    o387128170
NH    s292492417
PA    t253987822
PS    m392982075
RB    b91205976
RG    RG01000991
SD    d90020574
ST    l386717214
TD    T74316419
XA    x285017316
XY    X15839219

FILE2 Nexus

(LLO0482:0.0000019366,(LDG0360:0.0238905115,lp120326:0.0375485241)47:0.0419092189,((CB0429:0.3826265892,(D407893918:0.0583236501,RG01000991:0.0697907269)100:0.3489578738)32:0.0611129429,((t253987822:0.2364978839,((T74316419:0.0510072829,(v34499645:0.1213113809, u115350318:0.0776373720,p257095044:0.2395600298)44:0.0475754004)41:0.0605790634)80:0.1876842046,((m392982075:0.0594239626,((j192359877:0.0996057049,d90020574:0.0702371354)94:0.0939405031,(h83648856:0.1084254524,i385330117:0.0921078862)71:0.0360845353)62:0.0707594471)39:0.0613591919,(a110833242:0.0876612450,g304310012:0.1180135527)36:0.0371960189)30:0.0092030244)30:0.0647396824)18:0.0596473294,(o387128170:0.3064131143,(s292492417:0.1321821856,((e114319615:0.1906247302,(y53803544:0.1912864499,(n261854946:0.2068051096,(x285017316:0.0059190806,(X15839219:0.0683993704,l386717214:0.0457517668)56:0.0096790977)96:0.1853531541)61:0.1004069057)32:0.0604903866)7:0.0272158370,(c340781343:0.2602538492,(f222056709:0.4208238724,(z392383016:0.2288751890,b91205976:0.8011560891)67:0.0937313749)44:0.1020863459)11:0.0683604161)5:0.0903466856)7:0.0333376307)6:0.0374790692)37:0.0675670265)100:0.3661461042);
awk

2 answers

transform FILE1 to a set of patterns for sed

awk '{printf("s/%s/%s/g\n",$2,$1);}' FILE1 > patterns.txt

and then use those patterns to transform FILE2.

sed -f patterns.txt FILE2

Merci beaucoup Pierre

Far from being elegant, but should work:

while read line; do echo $line>temp; a=`cut -d ' ' -f 1 temp`; b=`cut -d ' ' -f 2 temp`; eval "sed -i -e's/$b/$a/g' file2"; done < file1

Thank you for your suggestion I will surely try

I am sorry. I forgot it was tab-delimited. Will edit in a minute - now I use spaces.

If i have several nexus files and one file containing the tab separated list as above where the first column remains same but second, third, fourth... to n column representing for the number of files... any suggestion for the script?

Could you pls explain it more? Do you have pairs (one tab separated file and one nexus) or what? Thanks.

The tab separated file contains all the list of names used in Nexus file and the first column in the tab separated file contains something like MJ NH PA PS RB....n In the above example I used two columns and one nexus file respectively I have one tab separated file and respectively several nexus files was my explanation a little better/ helpful to understand?

Log in to answer this question.