如果使用sed或awk在行中的字段分隔符数为5,如何在第三个字段后插入附加字段

时间:2016-02-20 13:59:30

标签: regex awk sed

是否可以运行一个sed命令来检查一行中的字段分隔符的数量,如果该行中的分隔符数为5,则插入一个额外的分隔符?

源数据示例:

a,aaa|bbbb|cccc|dddd|eeee|ffff|gggg
aaaa|bb,bb|dddd|eeee|fff,f|gggg
aaa,a|bbbb|cccc|dddd|eeee|ffff|gggg

目标输出示例:

a,aaa|bbbb|cccc|dddd|eeee|ffff|gggg
aaaa|bb,bb||dddd|eeee|fff,f|gggg
aaa,a|bbbb|cccc|dddd|eeee|ffff|gggg

注意:目标是在行的第二个字段分隔符之前或之后立即插入一个额外的字段分隔符(|)以创建空白的第3个字段,如果该行中仅存在5个字段分隔符。

如果使用sed无法做到这一点,那awk能否完成任务?

任何指导都将不胜感激。

3 个答案:

答案 0 :(得分:4)

这样的事情应该有效:

awk -F '|' -v OFS='|' 'NF<7{$2=$2 FS} 1'

-F '|'将输入字段分隔符设置为| -v OFS='|'将输出字段分隔符设置为|

当字段数NF小于7时,字段分隔符FS将附加到第二个字段。

答案 1 :(得分:1)

这可能适合你(GNU sed):

sed 's/|/&/6;t;s/|/&&/2' file

如果场分离器的数量(在这种情况下为6)足够,则纾困 否则,将所需字段上的字段分隔符加倍(在本例中为2)。

如果您只想添加分隔符(如果恰好有五个),请使用:

sed 's/|/&/6;t;s/|/&/5;T;s/|/&&/2' file

答案 2 :(得分:0)

使用sed肯定是可能的:

sed '/^[^|]*\(|[^|]*\)\{5\}$/s/|/||/2'

5是将触发替换的分隔符数,而行尾的2是将进行替换的分隔符计数。

这比我原来的尝试更具可读性和批次更易于维护:

sed 's/^\([^|]*|[^|]*\)\(\(|[^|]*\)\{4\}\)$/\1|\2/'

尽管如此,awk解决方案在可读性方面是最好的。