You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 06:50:25