combinando saída de diferentes scripts em arquivos diferentes em um loop

2

Este é um acompanhamento para Substitua uma coluna inteira em um arquivo por um único valor de outro arquivo combinado com R Passar Variável de R para Unix

Estou executando vários scripts (Perl, python e R) em um script Unix e preciso passar as saídas desses scripts para o Unix e combinar informações de arquivos diferentes criados por esses scripts.

Eu tenho um código de trabalho que é uma combinação das perguntas acima mencionadas:

A saída do script R chamada getenergie.R é um nome de arquivo. Existem vários nomes de arquivos que são retornados e eu preciso escrever em cada um desses arquivos e substituir a coluna 11 desses arquivos por um valor que vem de outro arquivo ( COP1A_report1 ) e é chamado de valor.

RES=($(./../getenergies.R))
for pdbnames in "${RES[@]}"
do

#write the one value from COP1A_report1 into column 11 of a file and save as TESTING

value=$(awk -F, 'NR==1{print $2;exit}' ./../COP1A_report1) 
awk '{$11 = v} 1' v="$value" ${pdbnames} > TESTING

printf "$value ${pdbnames}\n"
done

O que eu preciso é uma maneira de fazer um loop sobre isso para que ele escreva um valor de COP1A_report1 (linha $ 2, linha 1) na coluna 11 de um arquivo chamado como o primeiro nome de arquivo armazenado em $pdbnames , salve-o como um arquivo único e vá para COP1A_report1 (linha $ 2, linha 2), escreva na coluna 11 de um arquivo chamado como o segundo nome de arquivo armazenado em $pdbnames e assim por diante ...

Qual é a maneira mais inteligente de fazer isso? Eu posso imaginar algo como o código abaixo, mas algo está errado com a sintaxe e eu não recebo nenhum erro, apenas uma variável de valor vazia.

Alguma idéia?

counter=1
RES=($(./../getenergies.R))
for pdbnames in "${RES[@]}"
do

value=$(awk -F, 'NR==$counter{print $2;exit}' ./../COP1A_report1) #NR=1 needs to be changed to go through the entire list...
awk '{$11 = v} 1' v="$value" ${pdbnames} > TESTING$counter
counter=$(echo $counter+1 |bc)
printf "$value ${pdbnames}\n"
done
    
por gugy 28.10.2015 / 09:31

1 resposta

0

Você está tentando passar $counter para o script awk, portanto, é necessário usar aspas duplas em vez de aspas simples. Aspas simples são para strings literais, aspas duplas são para strings com variáveis nelas.

Como você usa aspas duplas aqui, isso significa que você precisa escapar $2 as \ no script awk para que o shell não substitua seu segundo argumento (se houver algum, string vazia) o script awk.

value=$(awk -F, "NR==$counter{print \;exit}" ./../COP1A_report1

Você também deve citar outras variáveis quando usá-las. por exemplo. awk ... > "TESTING$counter" - a falta de aspas era inofensiva nesse caso, mas sempre citar suas variáveis é um bom hábito para entrar.

Mesmo para counter=$(echo "$counter"+1 |bc) - não citar é inofensivo aqui, mas ainda é uma prática ruim.

Por fim, você está perdendo o comando -v do comando awk quando define v="$value" . deve ser -v v="$value"

counter=1
RES=($(./../getenergies.R))
for pdbnames in "${RES[@]}"
do

    value=$(awk -F, "NR==$counter{print \;exit}" ./../COP1A_report1)
    awk -v v="$value" '{$11 = v} 1' "$pdbnames" > "TESTING$counter"
    counter=$(echo "$counter"+1 |bc)
    printf "$value $pdbnames\n"

done
    
por 28.10.2015 / 09:42