【发布时间】:2013-02-27 00:02:01
【问题描述】:
我对 GNU sed 和 BSD sed 之间的区别有所了解。不幸的是我没有linux机器,只有mac可用。
我有一个 csv 格式的大数据文件,用逗号分隔。就连文件的前两行也太大了这里就不贴了,大家可以找前两行here。
我需要将 0,8,9,-999,-999.0 的值替换为“NA”,因为这些值是缺失值的代码。
我在 bash 提示符下使用了以下 sed 命令
sed -e 's/\-999\.?\0?/NA/g' \
-e 's/\-999/NA/g' \
-e 's/,9,/,NA,/g' \
-e 's/,8,/,NA,/g' \
-e 's/,0,/,NA,/g' \
firsttwolines.csv
结果看起来不错,只是仍然存在一个0。如何解决?以及如何将其放入 bash 脚本中?有没有更好的方法来完成这项任务?
【问题讨论】:
-
我假设您的输入包含
,0,0,,而您的输出包含,NA,0,?如果是这样 - 这是因为,0,的每次替换只能在之前的,0,替换结束的位置之后开始。 -
确实!那么
,0,0,怎么处理呢? -
如果除 0 以外的任何值都不能以 0 开头,则只需 ',0' => ',NA'
-
您的代码将用 NA 替换 9990
-
@IvyLee:我手边没有 BSD 机器,所以无法测试任何建议。这就是为什么我发表评论而不是回答的原因。 (当然,您可以只使用 Perl:
perl -ne 's/(^|(?<=,))([089]|-999(\.0)?)(?=,|$)/NA/g。无论如何,谁需要 sed?:-P)