如何用awk/sed批量替换CSV中AS_开头列的超标值为nan
批量处理CSV中所有AS_开头列的异常值替换
需求:CSV数据集中所有以AS_开头的列(如AS_2f、AS_5f),将其中数值大于20的内容替换为nan,实现批量处理而非单独列处理。
数据示例
cat << EOF > data.csv sl no,AS_2f,AD_2f,SR_2f,SV_2f,AS_5f,AD_5f,SR_5f,SV_5f 1.0,3.0,5.0,35.0,9.0,11.0,13.0,15.0,17.0 2.0,3.0,4.0,5.0,6.0,107.0,8.0,204.0,10.0 3.0,3.4,34.0,4.2,4.6,5.0,5.4,5.8,6.2 4.0,3.0,2.0,1.0,0.0,-1.0,-2.0,204.0,-4.0 5.0,24.5,44.0,63.5,83.0,102.5,122.0,141.5,161.0 6.0,32.0,58.0,84.0,110.0,136.0,162.0,188.0,214.0 EOF
现有脚本(仅处理单列)
awk -F',' 'NR==1 {print} NR>1 {for(i=2; i<=NF; i++) if ($i > 20 && i==2) $i="nan"; print}' data.csv
期望输出
sl no,AS_2f,AD_2f,SR_2f,SV_2f,AS_5f,AD_5f,SR_5f,SV_5f 1.0,3.0,5.0,35.0,9.0,11.0,13.0,15.0,17.0 2.0,3.0,4.0,5.0,6.0,nan,8.0,204.0,10.0 3.0,3.4,34.0,4.2,4.6,5.0,5.4,5.8,6.2 4.0,3.0,2.0,1.0,0.0,-1.0,-2.0,204.0,-4.0 5.0,nan,44.0,63.5,83.0,nan,122.0,141.5,161.0 6.0,nan,58.0,84.0,110.0,nan,162.0,188.0,214.0
解决方案
使用以下awk脚本可批量处理所有AS_开头的列:
awk -F',' ' NR==1 { # 遍历表头,记录所有AS_开头的列索引 for(i=1; i<=NF; i++) { if ($i ~ /^AS_/) { as_cols[i] = 1 } } print next } { # 遍历所有AS_列,替换大于20的值为nan for(i in as_cols) { if ($i > 20) { $i = "nan" } } # 保持CSV分隔符输出 OFS="," print }' data.csv
脚本说明
- 表头处理(NR==1):遍历第一行的所有列,将列名以
AS_开头的列索引存入数组as_cols,随后打印表头并跳过后续处理。 - 数据行处理:遍历
as_cols数组中的所有列索引,检查对应字段的值是否大于20,若是则替换为nan。 - 输出格式:设置输出分隔符为逗号(
OFS=","),确保输出符合CSV格式。
内容的提问来源于stack exchange,提问作者Kay
相关产品推荐
相关产品推荐

