awk sub 正在执行全局替换,而不是仅第一次出现

awk sub 正在执行全局替换,而不是仅第一次出现

我有这个 csv 文件,用分号分隔。我只想将第 8 个字段中第一次出现的 1 替换为 77。但 awk 命令将第 8 字段中的所有 1 替换为 77。我该怎么办?

原始 csv

1;abc;1;;;;;1;;1;;1;;;;;1;;;1;;
2;def;1;;;;;1;1;1;;;;;1;;;;1;;;
3;ghi;1;;;;1;1;1;1;;1;;1;1;;;;;1;;
4;jkl;1;;;;;1;;1;;1;1;;;1;;;;1;;

我试过这个

awk 'BEGIN{FS=OFS=";"} {sub(1, 77, $8)} {print}' ser.csv > tmp.csv

我正期待着这个

1;abc;1;;;;;77;;1;;1;;;;;1;;;1;;
2;def;1;;;;;1;1;1;;;;;1;;;;1;;;
3;ghi;1;;;;1;1;1;1;;1;;1;1;;;;;1;;
4;jkl;1;;;;;1;;1;;1;1;;;1;;;;1;;

但我明白了。

1;abc;1;;;;;77;;1;;1;;;;;1;;;1;;
2;def;1;;;;;77;1;1;;;;;1;;;;1;;;
3;ghi;1;;;;1;77;1;1;;1;;1;1;;;;;1;;
4;jkl;1;;;;;77;;1;;1;1;;;1;;;;1;;

答案1

假设“第一次出现”是指“整个输入中的第一次出现”,那么这可能就是您使用任何 awk 所想要的(未经测试):

awk 'BEGIN{FS=OFS=";"} !f && sub(1, 77, $8){f=1} {print}'

上面的内容替换了1所有输入中第 8 字段中出现的第一个内容。相反,如果您想在所有输入中第一次将第 8 个字段的值为 1 时替换,那么就是这样(或类似的):

awk 'BEGIN{FS=OFS=";"} !f && ($8==1){$8=77; f=1} {print}'

相关内容