如何用Shell脚本条件修改CSV数值:超1000的值设为1000(替代awk方案)
处理CSV文件中超出阈值的数值(Shell脚本方案)
以下是几个可行的Shell脚本方案,解决将CSV中Value列大于1000的数值替换为1000的需求:
1. 修正后的awk方案(最推荐)
很多时候awk失败是因为语法细节问题,下面是经过验证的写法,支持表头保留、数值判断和输出控制:
# 输出到新文件 awk 'NR==1{print; next} $2>1000{$2=1000} 1' input.csv > output.csv # 直接覆盖原文件(需用临时文件避免数据丢失) awk 'NR==1{print; next} $2>1000{$2=1000} 1' input.csv > temp.csv && mv temp.csv input.csv
说明:
NR==1{print; next}:第一行(表头)直接打印并跳过后续处理$2>1000{$2=1000}:判断第二列数值,大于1000则替换为1000- 最后的
1:表示打印当前处理后的行
2. sed方案(适合无复杂格式的CSV)
如果你的CSV格式简单(无空格分隔的字段),可以用sed正则匹配替换:
# 输出到新文件 sed -E '2,$ {/ 1000$/! s/ ([0-9]{4,})/ 1000/}' input.csv > output.csv # 直接覆盖原文件(生成.bak备份) sed -i.bak -E '2,$ {/ 1000$/! s/ ([0-9]{4,})/ 1000/}' input.csv
说明:
2,$:从第二行开始处理(跳过表头)/ 1000$/!:排除值为1000的行s/ ([0-9]{4,})/ 1000/:将空格后的4位及以上数字替换为1000(满足大于1000的需求)
3. Perl一行命令
若系统预装Perl,也可以用更灵活的字段处理:
# 输出到新文件 perl -pe 'if($.>1){@F=split; $F[1]=1000 if $F[1]>1000; $_=join(" ",@F)."\n"}' input.csv > output.csv
示例验证
输入内容:
Name Value ABV 1200 CCD 1000 CAD 500 DDD 1800
执行上述任一命令后,输出内容:
Name Value ABV 1000 CCD 1000 CAD 500 DDD 1000
内容的提问来源于stack exchange,提问作者ICHIGO1699
相关产品推荐
相关产品推荐

