awk '{for(x=1;x<=NF;x++)if($x~/0.00000/){sub(/0.00000/,++i)}}1' 파일 명령을 이해하는 방법

awk '{for(x=1;x<=NF;x++)if($x~/0.00000/){sub(/0.00000/,++i)}}1' 파일 명령을 이해하는 방법

이 명령은 다음과 같습니다.

awk '{for(x=1;x<=NF;x++)if($x~/0.00000/){sub(/0.00000/,++i)}}1'

이 명령은 파일에서 "0.00000"을 찾아 1부터 시작하는 증분 숫자로 대체한다는 것을 알고 있습니다. 'x<=NF'와 끝의 숫자 1 "{sub(/0.00000/ ,++i)}}1'을 제외한 거의 모든 내용을 이해합니다. 이 두 가지 사항을 알려주시겠어요?

또한 동일한 작업을 수행하고 싶지만 일치 항목을 0부터 시작하는 증분 숫자로 바꾸는 경우 이것이 맞습니다.

awk '{for(x=0;x<=NF;x++)if($x~/0.00000/){sub(/0.00000/,++i)}}1' file

답변1

NF값이 현재 레코드의 필드 수로 설정된 내부 Awk 변수입니다. 그래서

for(x=1;x<=NF;x++)

모든 필드를 반복합니다. 표현식 끝에 있는 숫자는 1패턴이 "true"로 평가될 때 기본 작업을 사용하여 전체 레코드를 인쇄하는 간단한 방법입니다.

awk 규칙에서는 모드나 작업 중 하나를 생략할 수 있지만 둘 다 생략할 수는 없습니다. 모드를 생략하면 입력 라인별로 연산이 수행됩니다. 이 작업을 생략하면 기본 작업은 패턴과 일치하는 모든 줄을 인쇄하는 것입니다. 1

0대신 숫자 증가를 시작하려면 1접두사를 ++i접미사로 바꿀 수 있습니다 i++.

awk '{for(x=1;x<=NF;x++)if($x~/0.00000/){sub(/0.00000/,i++)}}1'

전임자.

$ echo 'foo 0.00000123 bar' | awk '{for(x=1;x<=NF;x++)if($x~/0.00000/){sub(/0.00000/,++i)}}1'
foo 1123 bar

하지만

$ echo 'foo 0.00000123 bar' | awk '{for(x=1;x<=NF;x++)if($x~/0.00000/){sub(/0.00000/,i++)}}1'
foo 0123 bar
$

  1. GNU Awk 사용자 가이드: 1.3 몇 가지 간단한 예

답변2

아마도 그 점을 언급할 가치가 있을 것입니다.

sub(/0.00000/,i++)

전체 줄에서 첫 번째 항목을 대체합니다($0, 기본값). 때때로 이런 일이 발생할 수 있습니다 $x. 오류 방지 기능을 만들고 향후 응용 프로그램을 위해 다음으로 교체하십시오.

sub(/0.00000/,i++, $x)

관련 정보