Isso pode ser feito facilmente por awk
awk '
NR==1{
print
next }
f!=$3{
if(NR!=2)
print(line)
printf("%s\t",$1)
f=$3 }
{
line=$2 "\t" $3 }
END{
print line }
'
Eu tenho dados envolvendo códigos atribuídos a intervalos na forma de
From To Code
0 5 A
5 10 A
10 15 A
15 20 B
20 25 B
25 30 A
30 35 A
35 40 A
40 45 C
45 50 C
50 55 C
55 60 B
60 65 B
65 70 B
Eu quero condensar essa lista em uma lista como esta
From To Code
0 15 A
15 25 B
25 40 A
40 55 C
55 70 B
onde intervalos contíguos (por exemplo, 0-5, 5-10 e 10-15) com o mesmo código são mesclados.
Eu estou querendo saber se isso poderia ser feito por sed
ou awk
.
Isso pode ser feito facilmente por awk
awk '
NR==1{
print
next }
f!=$3{
if(NR!=2)
print(line)
printf("%s\t",$1)
f=$3 }
{
line=$2 "\t" $3 }
END{
print line }
'
Usando substituições de texto completo:
perl -p0E 'while( s/\n(\d+\s+)(\d+)\s+(\w+)\n\s+(\d+\s+)/\n$1$4/ ){}'
ou com comentários e recuo ...
perl -p0E 'while( # while we can
s/\n # substitute
(\d+ \s+) (\d+) \s+ (\w+) \n # n1 n2 id
\s+ (\d+ \s+ ) # n2 n3 id by
/\n$1$4/x # n1 n3 id
){}'
Se os dados estão sempre em ordem (como você apresentou), então você pode simplesmente analisar linhas encontrando a primeira e a última linha em um "grupo" onde o código é o mesmo. Para cada grupo, salve o valor "de" para a primeira linha e o valor "para" da linha final (antes que o código seja alterado). Imprima os grupos usando os valores que você salvou.
Tags text-processing awk sed