Separar valores dentro de um uma mesma coluna [RESOLVIDO]

13. Re: Separar valores dentro de um uma mesma coluna [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 29/03/2016 - 18:19h

Gregori.rov escreveu:

Olá..
Quero agradecer o espaço disponível pelo site para tentar resolver meu problema.
Seguinte, tenho um arquivo no seguinte formato, composto por três colunas:

1 a1 a1
1 b1 b1
1 c1 c1
2 a2 a2
2 b2 b2
2 c2 c2
3 a3 a3
3 b3 b3
3 c3 c3

Isso foi apenas para exemplo, meu arquivo tem de fato três colunas, no entanto, umas 900 MIL linhas, é gigante mesmo.
E preciso que o arquivo fique no formato

1
a1b1c1
a1b1c1
2
a2b2c2
a2b2c2
3
a3b3c3
a3b3c3

O arquivo que necessito é assim mesmo, é devido a exigencia de um programa de genética que preciso usar,
Na linha 1, que está representada pelo Valor "1" seria o individuo, a linha 2 que tem esses valor "a1b1c1" (que precisarão estar um ao lado do outro sem espaço mesmo) seria o alelo 1, enquanto que a linha 3 seria o alelo 3, a partir da linha quatro segue a mesma lógica mas pra outros individuos ("2" e "3" no caso). E no meu arquivo tenho 200 individuos.
O artigo original são três colunas, enquanto que oartigo necessitado será de apenas uma coluna.
Muito obrigado.

-----------------------------------------------------------------------------------------
Segue a minha colaboração . . .

#!/bin/bash
> arq.temp
sort arq|uniq -c|sed 's/^[ ]\+//' >> arq.temp
NL=$(awk 'END {print NR}' arq.temp)

for ((L=1;L<=$NL;L++));do
if (($L>1));then
LM=$((L-1))
LINANT=$(sed -n "$LM"p arq.temp)
read C1an C2an C3an C4an <<< "$LINANT"
LINATU=$(sed -n "$L"p arq.temp)
read C1at C2at C3at C4at <<< "$LINATU"
#SE C2 LINHA ATUAL = C2 LINHA ANTERIOR
if [ "$C2at" = "$C2an" ];then
for ((i=0;i<$C1at;i++));do
echo -n "$C3at $C4at "
done

else
echo -e "\n$C2at"
for ((i=0;i<$C1at;i++));do
echo -n "$C3at $C4at "
done
fi
else
LINATU=$(sed -n "$L"p arq.temp)
read C1at C2at C3at C4at <<< "$LINATU"
echo -e "\n$C2at"
for ((i=0;i<$C1at;i++));do
echo -n "$C3at $C4at "
done
fi
done
--------------------------------------------------------------------------------------------------------
EDITADO em 29/03/2016 as 19:50h
Pensando um pouquinho, deu para reduzir o código . . . :)

#!/bin/bash
NL=$(awk 'END {print NR}' $1)
for ((i=1;i<=$NL;i++));do
if egrep -q "\b$i\b" $1;then
echo -e "\n$i"
awk '{if($1=='$i')printf "%s %s " ,$2,$3}' $1;echo
fi
done;echo

cat arq
1 A A
1 A A
1 A A
1 A A
2 T T
2 T T
2 T T
2 T T
2 T T
2 T T
2 T T
2 A T
3 B B
3 B B

--------------------------------------------------------------------------------------------------------
Se resolver, marque como resolvido, por favor.
Gostando da resposta, marque-a como MELHOR, dessa forma, ganho uns pontinhos,
o que incentiva a continuar colaborando, ajudando, participando e compartilhando conhecimentos . . . :)

Att.:
Marcelo






  


14. Re: Separar valores dentro de um uma mesma coluna [RESOLVIDO]

Gregori Rovadoscki
Gregori.rov

(usa Outra)

Enviado em 29/03/2016 - 18:20h

Ramlethal escreveu:

#!/bin/bash
last_num=$(head -n 1 $1 | cut -d ' ' -f 1)

while read line; do
num=$(echo $line | cut -d ' ' -f 1)
line_1="$line_1 $(echo $line | cut -d ' ' -f 2)"
line_2="$line_2 $(echo $line | cut -d ' ' -f 3)"

if [ "$num" != "$last_num" ]; then
echo $last_num
echo $line_1
echo $line_2

line_1="$(echo $line | cut -d ' ' -f 2)"
line_2="$(echo $line | cut -d ' ' -f 3)"
fi
last_num=$num
done < $1

echo $last_num
echo $line_1
echo $line_2


Muitissímo Obrigado, agradeço imensamente sua atenção e sua pronta disposição.
Grande abraço.



15. Re: Separar valores dentro de um uma mesma coluna [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 29/03/2016 - 19:14h

Ramlethal escreveu:

#!/bin/bash
last_num=$(head -n 1 $1 | cut -d ' ' -f 1)

while read line; do
num=$(echo $line | cut -d ' ' -f 1)
line_1="$line_1 $(echo $line | cut -d ' ' -f 2)"
line_2="$line_2 $(echo $line | cut -d ' ' -f 3)"

if [ "$num" != "$last_num" ]; then
echo $last_num
echo $line_1
echo $line_2

line_1="$(echo $line | cut -d ' ' -f 2)"
line_2="$(echo $line | cut -d ' ' -f 3)"
fi
last_num=$num
done < $1

echo $last_num
echo $line_1
echo $line_2

--------------------------------------------------------------------
Boa noite Ramlethal.
Executei o seu script aqui, veja a saída:

./ORDENA-vol.sh arq
215
A A A A T
A A A A T
3000
T T T T T T T A
T T T T T T T T

Está correto?

Att.:
Marcelo



16. Re: Separar valores dentro de um uma mesma coluna [RESOLVIDO]

Gregori Rovadoscki
Gregori.rov

(usa Outra)

Enviado em 29/03/2016 - 19:15h

msoliver escreveu:

Gregori.rov escreveu:

Olá..
Quero agradecer o espaço disponível pelo site para tentar resolver meu problema.
Seguinte, tenho um arquivo no seguinte formato, composto por três colunas:

1 a1 a1
1 b1 b1
1 c1 c1
2 a2 a2
2 b2 b2
2 c2 c2
3 a3 a3
3 b3 b3
3 c3 c3

Isso foi apenas para exemplo, meu arquivo tem de fato três colunas, no entanto, umas 900 MIL linhas, é gigante mesmo.
E preciso que o arquivo fique no formato

1
a1b1c1
a1b1c1
2
a2b2c2
a2b2c2
3
a3b3c3
a3b3c3

O arquivo que necessito é assim mesmo, é devido a exigencia de um programa de genética que preciso usar,
Na linha 1, que está representada pelo Valor "1" seria o individuo, a linha 2 que tem esses valor "a1b1c1" (que precisarão estar um ao lado do outro sem espaço mesmo) seria o alelo 1, enquanto que a linha 3 seria o alelo 3, a partir da linha quatro segue a mesma lógica mas pra outros individuos ("2" e "3" no caso). E no meu arquivo tenho 200 individuos.
O artigo original são três colunas, enquanto que oartigo necessitado será de apenas uma coluna.
Muito obrigado.

-----------------------------------------------------------------------------------------
Segue a minha colaboração . . .

#!/bin/bash
> arq.temp
sort arq|uniq -c|sed 's/^[ ]\+//' >> arq.temp
NL=$(awk 'END {print NR}' arq.temp)

for ((L=1;L<=$NL;L++));do
if (($L>1));then
LM=$((L-1))
LINANT=$(sed -n "$LM"p arq.temp)
read C1an C2an C3an C4an <<< "$LINANT"
LINATU=$(sed -n "$L"p arq.temp)
read C1at C2at C3at C4at <<< "$LINATU"
#SE C2 LINHA ATUAL = C2 LINHA ANTERIOR
if [ "$C2at" = "$C2an" ];then
for ((i=0;i<$C1at;i++));do
echo -n "$C3at $C4at "
done

else
echo -e "\n$C2at"
for ((i=0;i<$C1at;i++));do
echo -n "$C3at $C4at "
done
fi
else
LINATU=$(sed -n "$L"p arq.temp)
read C1at C2at C3at C4at <<< "$LINATU"
echo -e "\n$C2at"
for ((i=0;i<$C1at;i++));do
echo -n "$C3at $C4at "
done
fi
done

Se resolver, marque como resolvido, por favor.
Gostando da resposta, marque-a como MELHOR, dessa forma, ganho uns pontinhos,
o que incentiva a continuar colaborando, ajudando, participando e compartilhando conhecimentos . . . :)

Att.:
Marcelo





Marcelo, muito obrigado por sua ajuda. Agradeço muito sua atenção.



01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts