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}'

おすすめ記事