Executando a função Prime Key usando 'Sed' no Bash

0

Estou usando bash e tentando empregar o comando sed para corresponder uma string e substituí-la por outra entre dois arquivos.

Objetivo: Para substituir todas as strings [sp_ *], combinando-as de outro arquivo que contenha [sp_ * Var_Names]. Por favor note que: 1. O pedido é sincronizado, mas não consecutivo em ambos os arquivos, portanto, não pode usar colar. 2. A funcionalidade é semelhante às operações primeKey no mysql.

Arquivo 1

+--sp_O00574_
|
+--sp_Q9TV16_
|
|     +--sp_O18983_
|  +--| (52)
|  |  |  +--sp_Q9BDS6_
|  |  +--| (26)
|  |     |  +--sp_O19024_
|  |     +--| (29)
|  |        +--sp_Q9XT45_

Arquivo2

O00574  CXCR6_HUMAN
Q9TV16  CXCR6_PANTR
O18983  CXCR6_CHLAE
Q9BDS6  CXCR6_MACFA
O19024  CXCR6_MACNE
Q9XT45  CXCR6_MACMU

Objetivo: Para sed-ias / O00574 / CXCR6_HUMAN / g 'Arquivo1

script de bash em linha:

cat File2 | while read id; do upID='echo $id | cut -d " " -f1'; upName='echo $id | cut -d " " -f2'; sed -ie 's/sp_$upID/$upName/g' File1; done

Script.sh

#/bin/bash

cat File2 | while read id;
do
    upID='echo $id | cut -d " " -f1'
    upName='echo $id | cut -d " " -f2'

    sed -ie 's/sp_$upID/$upName/g' File1
done

Problema: O comando sed não funciona no loop. Nenhuma alteração é observada no arquivo1, em tudo. Se eu fizer o eco do comando sed a partir do script e depois executá-lo no terminal, ele funcionará como esperado. Não consigo descobrir qual poderia ser o problema.

Obrigado pelos seus valiosos comentários e solução.

    
por Tarun JaiRaj Narwani 02.06.2016 / 17:32

1 resposta

2

gere um script sed a partir do seu arquivo de índice (File2) em vez de um loop, em seguida, execute o script em seu arquivo1. Ele será MUITO mais rápido:).

 awk '{ print "s/sp_"$1"/"$2"/g"}' File2.txt > tranform.sed

faça:

 sed -i -f transform.sed File1.txt 

para que todo o seu script seja:

awk '{ print "s/sp_"$1"/"$2"/g"}' File2.txt > transform.sed
sed -f transform.sed File1.txt

## if you want to remove your transformation file
rm transform.sed
    
por 02.06.2016 / 18:48