이 명령은 다음과 같습니다.
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
$
답변2
아마도 그 점을 언급할 가치가 있을 것입니다.
sub(/0.00000/,i++)
전체 줄에서 첫 번째 항목을 대체합니다($0, 기본값). 때때로 이런 일이 발생할 수 있습니다 $x
. 오류 방지 기능을 만들고 향후 응용 프로그램을 위해 다음으로 교체하십시오.
sub(/0.00000/,i++, $x)