文字列で始まる行のフィールドのみを定義済みの文字列に置き換えます

文字列で始まる行のフィールドのみを定義済みの文字列に置き換えます

処理する必要があるファイルはここにあります。

ENR1;203023;0000;H606626;001505;EL;00;1234;0000100;00;00;201346100;H6022418;
ENR6;000218;130155;000;00;201443;000000000;000000000;000000000;000000000;
ENR1;203357;0000;H606626;001653;EL;01;2546;0000800;00;00;201346100;H6022418;
ENR6;000218;130155;000;00;201503;000000000;000000000;000000000;000000000;
ENR6;001811;150316;000;00;201624;000000000;000000000;000000000;000000000;
ENR1;203385;0000;H606625;000615;EL;00;5861;0000100;00;00;201346100;H6022418;

各行のフィールド7を に置き換える必要があります。値が の場合00、 に設定する必要があります01。ただし、最初のフィールドが である行に限ります。ENR1!

awk -F';' -v OFS=';' 'NR>=1{sub("00","01",$7)}1' file > result

これは機能しますが、フィールド $7 も ENR6 で始まる行に置き換えられます。

条件を追加する方法(ENR1 で始まる行のみ?)

答え1

私は試してみたい

awk -F';' -v OFS=';' '$7 == "00" && $1 == "ENR1" { $7 = "01" } {print} ' file > result

どこ

  • $7 == "00" && $1 == "ENR1" { $7 = "01" }で始まりENR1、7番目のフィールドが に等しい行にのみ適用されます。00
  • $7 = "01"7番目のフィールドを01に設定する
  • { print }変更後の ENR1 を含むすべての行を印刷します。

  • NR>=1実際のファイルに 1 行のヘッダーがある場合は、テストを継続することをお勧めします。

答え2

短いsedアプローチ:

sed -E 's/^(ENR1;([^;]+;){5})00;/\101;/' file

出力:

ENR1;203023;0000;H606626;001505;EL;01;1234;0000100;00;00;201346100;H6022418;
ENR6;000218;130155;000;00;201443;000000000;000000000;000000000;000000000;
ENR1;203357;0000;H606626;001653;EL;01;2546;0000800;00;00;201346100;H6022418;
ENR6;000218;130155;000;00;201503;000000000;000000000;000000000;000000000;
ENR6;001811;150316;000;00;201624;000000000;000000000;000000000;000000000;
ENR1;203385;0000;H606625;000615;EL;01;5861;0000100;00;00;201346100;H6022418;

  • ^(ENR1;([^;]+;){5})00;- で始まり、ENR1その後に5つのフィールド([^;]+;){5}と7番目のフィールドが続く行をキャプチャします00;

関連情報