僅將以字串開頭的行的欄位替換為已定義的字串

僅將以字串開頭的行的欄位替換為已定義的字串

這是我需要處理的文件。

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

這有效,但也用以 ENR6 開頭的行替換欄位 $7。

如何新增條件(僅以 ENR1 開頭的行?)

答案1

我會嘗試

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

在哪裡

  • $7 == "00" && $1 == "ENR1" { $7 = "01" }僅適用於以 開頭的行ENR1,第七個欄位等於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;

相關內容