这是我需要处理的文件。
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;