在条件下连续连续2行

时间:2011-11-12 07:20:53

标签: sed awk

我有5行,如:

typeA;pointA1
typeA;pointA2
typeA;pointA3
typeB;pointB1
typeB;pointB2

结果输出为:

typeA;pointA1;typeA;pointA2
typeA;pointA2;typeA;pointA3
typeB;pointB1;typeB;pointB2

为此可以使用sed或awk吗?

3 个答案:

答案 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现在保持前一行。