私が処理するファイルです。
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
実際のファイルにヘッダー行があるかどうかをテストし続けることができます。
答え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;