编写Shell脚本从data.csv读取并导出薪资高于5000的记录
解决CSV文件筛选薪资大于5000记录的AWK问题
问题根源
你的AWK命令存在三个核心错误:
- 未指定CSV分隔符:AWK默认以空白字符分割字段,但你的data.csv是逗号分隔,必须显式设置
FS=",",否则整行会被识别为单个字段,判断逻辑完全失效。 - 错误引用列名:AWK中
$后只能跟字段编号(如$3),不能直接用列名esal。需要先解析表头,把列名映射为对应字段索引。 - 输出内容错误:你当前命令只打印薪资字段,但需求是输出整行符合条件的记录,应该用
print $0。
正确解决方案
方式1:编写AWK脚本文件(可读性更好)
创建filter_salary.awk文件,内容如下:
BEGIN { FS="," } # 设置字段分隔符为逗号 NR==1 { # 遍历表头,建立列名到字段索引的映射 for (i=1; i<=NF; i++) { column_index[$i] = i } print $0 # 打印表头 next # 跳过表头行的后续处理 } # 判断薪资字段值是否大于5000,满足则打印整行 $column_index["esal"] > 5000 { print $0 }
执行命令:
awk -f filter_salary.awk data.csv > high_salary.csv
方式2:单行命令(快速执行)
awk 'BEGIN{FS=","} NR==1{for(i=1;i<=NF;i++)col[$i]=i;print;next} $col["esal"]>5000' data.csv > high_salary.csv
效果验证
假设data.csv内容为:
eid,ename,esal 101,Raju,8000 567,pinky,4000
执行后high_salary.csv的内容将符合你的期望:
eid,ename,esal 101,Raju,8000
内容的提问来源于stack exchange,提问作者P. BHAVANA
相关产品推荐
相关产品推荐

