textmode
(usa Slackware)
Enviado em 16/04/2016 - 14:02h
DeidyC escreveu:
Bom dia, Galera. Seguinte, tenho um arquivo e preciso fazer várias mudanças. Segue abaixo o que eu preciso
SP-255
Name Area "Area Percent"
C11:0 26388 0,003
C12:0 1864834 0,210
"C13:0 iso" 43407 0,005
"C13:0 anteiso"
C12:1 8122 0,001
C13:0 119474 0,013
"C14:0 iso" 628997 0,071
C14:0 25586509 2,884
"C15:0 iso" 1662475 0,187
Totals
879171767 99,106
SP-256
Name Area "Area Percent"
C11:0 119474 0,013
C12:0 628997 0,071
"C13:0 iso" 25586509 2,884
"C13:0 anteiso" 1662475 0,187
C12:1 1928392 0,217
C13:0
"C14:0 iso" 8122 0,001
C14:0 119474 0,013
"C15:0 iso" 628997 0,071
Totals
879171767 99,106
E preciso que ele fique assim
C11:0 C12:0 "C13:0 iso" "C13:0 anteiso" C12:1 C13:0 "C14:0 iso" C14:0 "C15:0 iso"
SP-255 0,003 0,210 0,005 0,001 0,013 0,071 2,884 0,187
SP-255 0,013 0,071 2,884 0,187 0,217 0,001 0,013 0,071
SP é uma amostra, no exemplo pus apenas 2, mas tenho 145 amostras, os C's correspondem a ácidos graxos, no exemplo tenho 9 mas na realidade tenho 52 pra cada um dos 145 individuos, o que tá em aspas quis mostrar que é um nome só e devem estar na mesma coluna. E aquelas informações total e entre individuos estão da forma que pus, separados por uma linha em branco. Ah, existem acidos gráxos sem informação, e estão com o campo em branco. E preciso na verdade do individuo dos ácidos graxos e do área percent, mas um embaixo do outro. Muito obrigado. Se alguém puder me ajudar obrigado. O arquivo que preciso não ficou bem apresentado aqui. mas os individuos ficam na coluna um, e os ácidos graxos são a partir da coluna 2
O negócio aqui ficou meio confuso e é complicado de qualquer forma... Vamos por partes:
- "SP" são amostrar e também são indivíduos. Existem 145 e os do seu exemplo são SP-255 e SP-256;
- "C" são ácidos graxos e existem 52 para cada "SP". No exemplo são o intervalo entre C11 e C15;
- A informação "Totals" tem um total de alguma e outro troço chamado "entre indivíduos". (Mas o que é isso?);
- Você diz precisa do indivíduo dos ácidos graxos, ou seja, os "C's" dos "SPs", correto?
- Também precisa dos "Area Percent" embaixo dos "C's", mas agora só está descrevendo a saída como no item anterior, correto?
Então é só uma transposição "simples" como você mesmo mencionou. Armazenar o nome da amostra/indivíduo ("SP") para "casar" com os ácidos graxos ("C"), ler o "Area Percent" e armazenar a chave=valor para depois fazermos a transposição da "matriz"... ou já fazer tudo de uma vez. Só faltou dizer o quê separa as "colunas" desse arquivo. Vou assumir que é o caractere de tabulação porque fica fácil para mim :P. Aqui vai uma solução em puro bash, mas é possível fazer com uma grande combinação de ferramentas distintas:
declare amostra acido_graxo area_percent
declare -a matriz
declare -i i=0
while IFS=$'\t\n' read -a record; do
if [[ "${record[0]}" =~ ^SP-[0-9]+$ ]]; then
amostra="${record[0]}"
let i++
matriz[$i]=$amostra;
elif [[ ${record[0]} =~ ^\"?C[0-9]+:[0-9]+ ]]; then
acido_graxo="${record[0]}"
if [[ $i == 1 ]]; then
if [[ -z ${matriz[0]} ]]; then
printf -v matriz[0] '\t%s' "${acido_graxo}"
else
printf -v matriz[0] '%s\t%s' "${matriz[0]}" "${acido_graxo}"
fi
fi
area_percent=${record[2]}
printf -v matriz[$i] '%s\t%s' "${matriz[$i]}" "$area_percent"
else
continue
fi
done < arquivo_doido_do_deidyc.txt
for (( i = 0; i <= ${#matriz[*]}; i++ )); do
echo "${matriz[$i]}"
done
Com linguagens de programação como Perl é ainda mais fácil.