Organização de arquivo (transpor e edição)

1. Organização de arquivo (transpor e edição)

Deidy Campiol
DeidyC

(usa Outra)

Enviado em 16/04/2016 - 10:58h

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


  


2. Re: Organização de arquivo (transpor e edição)

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 16/04/2016 - 12:58h

Boa tarde DeidyC.
Para evitar que eu cometa ERROS, poste o arquivo COMPLETO.
Sobe para o Google Drive e posta o link...

No aguardo,
Marcelo


3. Re: Organização de arquivo (transpor e edição)

Ronaldo Ferreira de Lima
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.




4. Re: Organização de arquivo (transpor e edição)

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 16/04/2016 - 18:00h

DeidyC escreveu:
Bom dia, Galera. Seguinte, tenho um arquivo e preciso fazer várias mudanças. Segue abaixo o que eu preciso

Boa tarde Deidy, tudo certo?
Se eu entendi corretamente, o script é esse:

#!/bin/bash
awk -F"\n" 'BEGIN {RS="\n\n";OFS="\n";} {if(NF>3) print $0; else print $0"\n"}' ORIGEM.txt|sed 's/\( \)\([a-z]\+\)/_\2/' >> ORIGEM_TEMP.txt
NReg=$(awk -F"\n" 'BEGIN {RS="\n\n";OFS="\n";} END { print NR}' ORIGEM_TEMP.txt )
for ((x=1;x<=$NReg;x++));do
(($x==1)) && awk -F"\n" 'BEGIN {RS="\n\n";OFS="\n";} NR==1 { print $0}' ORIGEM_TEMP.txt |awk '$1 ~ /^C[0-9]+:/ {print $1}'|xargs|sed 's/ /\t/g;s/_/ /g' > RESULT.txt
AMST=$(awk -F"\n" 'BEGIN {RS="\n\n";OFS="\n";}NR=='$x' { print $1}' ORIGEM_TEMP.txt)
awk -F"\n" 'BEGIN {RS="\n\n";OFS="\n";} NR=='$x' { print $0}' ORIGEM_TEMP.txt |awk 'BEGIN{printf "'$AMST' "} $1 ~ /^C[0-9]+:/ {print $3}'|xargs|sed 's/ /\t/g' >> RESULT.txt
done


É isso ai... :)

----------------------------------------------------------------------------------------
Se a resposta lhe ajudou, marque-a como a MELHOR, dessa forma, ganho uns pontos,
o que incentiva a continuar colaborando, ajudando, participando e compartilhando conhecimentos . . . :)
----------------------------------------------------------------------------------------
Abç.:
Marcelo Oliver








Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts