Como passar valores de variáveis para um script e executá-lo em uma linha?

0

Eu tenho um arquivo (temp_4n.in) com as seguintes linhas:

 5  C   172.0696  
 5  C   135.6942  
 5  H   30.9062  
 5  H   31.8124  
 12 H   31.0377  
 12 O   293.0612  
 12 H   32.4678  

Eu tenho um script (testsc.txt) que irá extrair o último H para as linhas que começam com um determinado número que eu mudarei regularmente:

 grep $'^${mold}\tH' temp_4n.in | tail -1 > temp_5n.in

No entanto, quando eu executo o script (querendo, por exemplo, a linha que começa com 12) usando o seguinte comando, ele falha:

 qsub -v mold=12 ./testsc.txt

Eu acho que isso tem algo a ver com o primeiro '$' no comando grep sendo considerado como um parâmetro e erroneamente sendo substituído. Alguém pode me ajudar a descobrir qual é o problema?

    
por A. B 15.04.2018 / 20:39

1 resposta

1

qsub -v varname=value define varname para o value fornecido no ambiente do trabalho enviado.

No script enviado, você usa esse valor em um comando grep , mas a string que contém a variável é citada com aspas simples, impedindo que o shell o expanda.

Seu script deve estar usando

grep "^$mold[[:blank:]]H" temp_4n.in | tail -1 > temp_5n.in

O $ inicial em seu código ( $'...' ) não é necessário aqui e, em vez disso, usamos [[:blank:]] para corresponder a um espaço ou uma guia.

Uma alternativa seria usar awk no seu script:

awk -v mold="$mold" '$1 == mold && $2 == "H" { this = $0 } END { print this }' temp_4n.in >temp_5n.in

Isso usa comparações de strings (não expressões regulares) para testar a primeira e a segunda coluna, e quando uma linha correspondente é encontrada, toda a linha é salva na variável this . No final, o último valor de this é impresso. Isso substitui os dois grep e tail .

    
por 15.04.2018 / 20:51

Tags