[英]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.