0

我有一个空格分隔的文本文件,其中包含.作为缺失数据的句点和作为小数分隔符的句点。我想用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

4 回答 4

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
于 2012-04-18T21:38:47.537 回答
6

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

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

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

于 2012-04-18T21:38:50.357 回答
1

这可能对您有用:

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

或者如果.123不存在这样的数字:

sed 's/ \./ Nan/g' file
于 2012-04-18T22:53:05.013 回答
-1

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

于 2012-04-18T21:35:00.917 回答