用虚拟值替换分隔文本文件中的空字段

时间:2012-10-04 17:54:13

标签: regex sed awk

我正在开发一个项目,该项目采用以下格式的分隔数据集:

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?

4 个答案:

答案 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