使用awk替换CSV文件除第三行外第二列值失败的问题排查
解决awk命令未保留第三行的问题
问题重现
给定数据集:
Meredith Norris Thomas;Regular Air;HomeOffice;Office Supplies;Envelopes;Small Box;Park Ridge⢠Embossed Executive Business Envelopes Paige Mason;Regular Air;Corporate;Office Supplies;Labels;Small Box;*Staples* Packaging Labels Kara Pace;Regular Air;HomeOffice;Office Supplies;Scissors, Rulers and Trimmers;Small Pack;Fiskars® Softgrip Scissors Kristina Collier;Regular Air;Consumer;Office Supplies;Labels;Small Box;Avery 498 Ryan Foster;Regular Air;HomeOffice;Office Supplies;Scissors, Rulers and Trimmers;Wrap Bag;Letter Slitter
需求是将CSV中除第三行外的所有行第二列"Regular Air"替换为"Irregular Air",但执行以下命令后,第三行直接消失:
awk 'BEGIN{FS=";";OFS=";"} NR!=3{$2="Irregular Air";print $0}' sales.csv
实际输出缺失第三行,而预期需要保留第三行且不修改它。
问题原因
原命令的逻辑是:仅当NR!=3(行号不是3)时,修改第二列并打印该行。第三行既没有被修改,也没有触发打印操作,因此被过滤掉了。
解决方案
需要让所有行都被打印,仅对非第三行做修改。有两种简洁写法:
写法1:显式条件判断
awk 'BEGIN{FS=";";OFS=";"} {if(NR!=3) $2="Irregular Air"; print $0}' sales.csv
写法2:awk简写风格
awk 'BEGIN{FS=OFS=";"} NR!=3 {$2="Irregular Air"} 1' sales.csv
这里的1是awk的惯用写法,代表布尔值真,会触发默认的print $0动作,确保所有行都被输出。非第三行先修改第二列,再打印;第三行直接打印原内容。
执行上述任一命令后,就能得到符合预期的输出:
Meredith Norris Thomas;Irregular Air;HomeOffice;Office Supplies;Envelopes;Small Box;Park Ridge⢠Embossed Executive Business Envelopes Paige Mason;Irregular Air;Corporate;Office Supplies;Labels;Small Box;*Staples* Packaging Labels Kara Pace;Regular Air;HomeOffice;Office Supplies;Scissors, Rulers and Trimmers;Small Pack;Fiskars® Softgrip Scissors Kristina Collier;Irregular Air;Consumer;Office Supplies;Labels;Small Box;Avery 498 Ryan Foster;Irregular Air;HomeOffice;Office Supplies;Scissors, Rulers and Trimmers;Wrap Bag;Letter Slitter
内容的提问来源于stack exchange,提问作者Faisal
相关产品推荐
相关产品推荐

