繁体   English   中英

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

[英]How to insert additional field after third field if number of field separators in line is 5 using sed or awk

例如,是否可以运行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

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

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

任何指导将不胜感激。

这样的事情应该起作用:

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

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

当场数NF小于7时,场分隔符FS被附加到第二场。

这可能对您有用(GNU sed):

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

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

如果只想添加五个分隔符,请使用:

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

sed最有可能实现:

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

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

这已经是有点更具可读性和很多比我原来的企图更易于维护:

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

不过,就可读性而言,awk解决方案是最好的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM