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