
여기 제가 처리해야 할 파일이 있습니다.
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;