我有涉及分配给范围的代码的数据,其形式为
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
或来完成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”值(在代码更改之前)。使用您保存的值打印这些组。