删除点但不是小数点

时间:2012-04-18 21:31:06

标签: perl sed

我有一个空格分隔的文本文件,其中包含句点.作为缺失数据,句点包含小数分隔符。我想用NaN替换所有丢失的数据周期,并留下小数分隔符 - 这是一个例子:

示例数据:

1981 12 23 . 4.5 . .
1981 12 24 4.6 7.8 1.2 22.0
1981 12 25 . . . .
1981 12 26 2.1 . 3.1 .

期望的输出:

1981 12 23 NaN 4.5 NaN NaN
1981 12 24 4.6 7.8 1.2 22.0
1981 12 25 NaN NaN NaN NaN
1981 12 26 2.1 NaN 3.1 NaN

非常感谢在unix环境中使用sed,tr,perl的任何帮助

4 个答案:

答案 0 :(得分:6)

这个Perl程序将执行此操作,替换旁边没有数字的任何点:

#!/Users/brian/bin/perls/perl5.14.2

while( <DATA> ) {
    s/ (?<!\d) \. (?!\d) /NaN/xg;
    print;
    }

__END__
1981 12 23 . 4.5 . .
1981 12 24 4.6 7.8 1.2 22.0
1981 12 25 . . . .
1981 12 26 2.1 . 3.1 .

这是一个简短的Perl单行:

% perl -pe 's/ (?<!\d) \. (?!\d) /NaN/xg' input_file

答案 1 :(得分:6)

在这里使用否定的外观断言似乎是一个好主意。

perl -plwe 's/(?<!\d)\.(?!\d)/NaN/g;' file.txt

换句话说,只有在周围的字符不是数字时才替换。如果您有以下数字,则可能会失败:.1231(与0.1231相对)。在这种情况下,您可以删除第一个环视。

答案 2 :(得分:1)

这可能对您有用:

sed ':a;s/ \. / Nan /g;ta;s/ \.$/ Nan/' file

或者如果.123之类的数字不存在:

sed 's/ \./ Nan/g' file

答案 3 :(得分:-1)

检查点后面的下一个字符是否为空格。如果是,请在那里添加NaN。