typeA;pointA1
typeA;pointA2
typeA;pointA3
typeB;pointB1
typeB;pointB2
typeA;pointA1;typeA;pointA2
typeA;pointA2;typeA;pointA3
typeB;pointB1;typeB;pointB2
为此可以使用sed或awk吗?
答案 0 :(得分:2)
使用awk很容易:
awk -F';' '$1 == prevType { printf("%s;%s;%s\n", $1, prevPoint, $0) } { prevType = $1; prevPoint = $2 }'
我假设记录之间的空行不是输入的一部分;如果是,只需在awk之前通过grep -v '^$'
运行输入。
答案 1 :(得分:1)
粘贴可能很有用。它可以节省很多代码:
sed '1d' file|paste -d";" file -|awk -F';' '$1==$3'
请参阅下面的测试
kent$ cat a
typeA;pointA1
typeA;pointA2
typeA;pointA3
typeB;pointB1
typeB;pointB2
kent$ sed '1d' a|paste -d";" a -|awk -F';' '$1==$3'
typeA;pointA1;typeA;pointA2
typeA;pointA2;typeA;pointA3
typeB;pointB1;typeB;pointB2
答案 2 :(得分:0)
这个GNU sed解决方案可能适合您:
sed -rn '1{h;b};H;x;/^([^;]*);.*\n\1/!{s/.*\n//;x;d};s/\n/;/p' source_file
假设没有空白行管道预先格式化源文件sed '/^$/d' source_file
编辑:
经过反思,上述解决方案过于复杂,可以简化为:
sed -ne '1{h;b};H;x;/^\([^;]*\);.*\1/s/\n/;/p' source_file
说明:
-n
可防止隐式打印任何行。将第一行复制到保留空间(HS为额外寄存器),然后进行中断以结束迭代。所有后续行都附加到HS。然后将HS与模式空间交换(PS - 保持当前行的寄存器)。此时的HS包含先前和当前行,现在检查这些行以查看每行中的第一个字段是否相同。如果是这样,将两行分隔的换行符替换为;
,并提供PS打印出来的替换。现在进行下一次迭代,当前行刷新PS,HS现在保持前一行。