
次の形式の範囲に割り当てられたコードに関連するデータがあります。
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
このリストを次のリストに圧縮したいと思います。
From To Code
0 15 A
15 25 B
25 40 A
40 55 C
55 70 B
同じコード(たとえば、0-5、5-10、10-15)を含む連続範囲はマージされます。sed
orでこれを行うことができるかどうか疑問に思いますawk
。
答え1
これは簡単にできます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 }
'
答え2
フルテキスト置換の使用:
perl -p0E 'while( s/\n(\d+\s+)(\d+)\s+(\w+)\n\2\s+(\d+\s+\3)/\n$1$4/ ){}'
または注釈とインデントで...
perl -p0E 'while( # while we can
s/\n # substitute
(\d+ \s+) (\d+) \s+ (\w+) \n # n1 n2 id
\2 \s+ (\d+ \s+ \3 ) # n2 n3 id by
/\n$1$4/x # n1 n3 id
){}'
答え3
データが常に順番に(表示されているように)存在する場合は、行を解析して同じコードを使用して「グループ」の最初と最後の行を見つけることができます。各グループについて、最初の行の「from」値と最後の行の「to」値(コード変更前)を保存します。保存した値を使用してこのグループを印刷します。