문자열로 시작하는 줄에 대해서만 필드를 정의된 문자열로 바꿉니다.

문자열로 시작하는 줄에 대해서만 필드를 정의된 문자열로 바꿉니다.

여기 제가 처리해야 할 파일이 있습니다.

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;- ENR15개 필드 ([^;]+;){5}와 7번째 필드 로 시작하는 줄을 캡처합니다.00;

관련 정보