我正在开发一个项目,该项目采用以下格式的分隔数据集:
field1~field2~field3~.....~fieldn
有空字段是可能的,所以
field1~~~field4~~field6
完全可以接受。
这个文件是使用内部翻译程序翻译的,只留下了一些不足之处。具体来说,它不能很好地处理空字段。我的解决方案是在那里粘贴一些虚拟值,如空格或@符号。我试过了:
sed -r 's/~/~ ~/g'
和
awk '{gsub(/\~\~/,"~ ~")}; 1' file > file.SPACE
但是这两个都无法取代MULTIPLE字段。所以,如果我输入
field1~field2~~~field3
它会输出:
field1~field2~ ~~field3
如果可以,我想编写脚本,因为我无法更改翻译器的代码。我可以更改创建分隔文件的程序中的代码,但我宁愿不这样做。是否有一些解决方法,或者为这个只是常规语言中的一个固有限制提出表达式?
编辑:哇谢谢大家快速回复,所有解决方案都有效,所以我对所有这些都进行了投票。我想我会接受Janito的解释。
也是为什么downvote?
答案 0 :(得分:4)
你可以尝试:
sed -e ':a;s/~~/~ ~/;ta'
这将使用“:”命令创建标签“a”,然后用~~
替换~ ~
的一个出现,然后使用“t”测试命令跳回到“a” “如果前一个替换命令成功,则标记。
希望这有助于=)
答案 1 :(得分:3)
awk '{for( i=0; i<=NF; i++ ) if( $i ~ /^$/ ) $i = " " } 1' FS='~' OFS='~' input
或:
awk '/^$/{ $0 = " " } 1' ORS='~' RS='~' input
或:
awk '{ while( gsub( "~~", "~ ~" )); }1' input
答案 2 :(得分:1)
sed -e ':loop' -e 's/~~/~ ~/g' -e 't loop' file
答案 3 :(得分:1)
您可以使用Perl
perl -pe 's/~(?=~)/~ /g'
...代表"~"
替换每个"~"
"~ "
将结果存储到file.SPACE
使用
perl -pe 's/~(?=~)/~ /g' file >file.SPACE