我有这个 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}'