gpt4 book ai didi

bash - BSD sed 无法全部替换 ",0,"

转载 作者:行者123 更新时间:2023-11-29 09:15:21 25 4
gpt4 key购买 nike

我对 GNU sed 和 BSD sed 之间的区别略有了解。不幸的是我没有 linux 机器,只有 mac 可用。

我有一个 csv 格式的大数据文件,用逗号分隔。即使文件的前两行太大而无法在此处发布,您可以找到前两行 here .

我需要用“NA”替换 0,8,9,-999,-999.0 的值,因为这些值是缺失值的代码。

我在 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 脚本中?有没有更好的方法来完成这个任务?

最佳答案

根据我的经验,在处理 CSV 文件格式时,sed、awk 等文本扫描工具无法处理所有极端情况。我知道您特别要求在 sed 中寻求解决方案,但它并没有很好地完成工作。我推荐一种提供强大的 CSV 文件处理的语言,例如 Python 或 Tcl(还有更多,但这些是我所知道的)。这是 Python 中的解决方案:

# csvreplace.py

import sys
import csv

if __name__ == '__main__':
infilename = sys.argv[1]
outfilename = sys.argv[2]

with open(infilename) as infile, open(outfilename, 'w') as outfile:
csvreader = csv.reader(infile)
csvwriter = csv.writer(outfile)
na_list = ['0', '8', '9', '-999', '-999.0']
for row in csvreader:
row = [col in na_list and 'NA' or col for col in row]
csvwriter.writerow(row)

您可以在您的 bash 脚本中使用它:

python csvreplace.py data.csv out.csv

关于bash - BSD sed 无法全部替换 ",0,",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15344885/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com