파일의 특정 줄을 순차적으로 바꾸는 다음 awk 명령을 찾았지만 이것이 어떻게 작동하는지 알고 싶습니다.
입력하다:-
DS: 1
DS: 1
DS: 1
DS: 1
DS: 1
DS: 1
DS: 1
산출:-
DS: 1
DS: 2
DS: 3
DS: 1
DS: 2
DS: 3
DS: 1
DS: 2
DS: 3
awk 명령:-
awk '$1 ~ /DS:/ {$NF=((c++ % count) + 1)} 1' count=3
답변1
awk
나는 그 작업 명령이 다음과 같다고 믿을 만한 이유가 있습니다.
awk -v count=3 '/DS:/ {$NF=((c++ % count) + 1)} 1' input
input
입력 파일은 어디에 있습니까? 또한 질문에 지정된 출력을 생성하려면 입력 파일에 7줄이 아닌 9줄이 있어야 한다고 생각합니다.
작동 방식은 다음과 같습니다.
먼저 옵션이 -v count=3
할당됩니다 3
.awk
바꾸다 count
. 질문에 있는 방식으로 작성된 경우( count=3
명령 끝 부분) 3
에 할당됩니다.쉘 변수및 에 액세스할 수 없으며 암시적으로 로 초기화되므로 awk
0으로 나누기 오류가 발생합니다 .count
0
존재하다
/DS:/ {$NF=((c++ % count) + 1)}
이 /DS:/
부분이 중괄호로 묶인 블록의 조건입니다. 이는 정규식을 나타내며 DS:
문자열만 일치시킬 수 있습니다 DS:
. 이 조건은 포함된 모든 행과 일치합니다 DS:
.
이러한 모든 행에 대해 변수가 c
증가한 다음 모듈로로 증가됩니다 count
. 이 변수를 명시적으로 정의 하지 않았기 때문에 이 코드 블록이 처음 실행될 때 값 c
으로 암시적으로 초기화됩니다 .0
그런 다음 결과가 에 추가되고 1
할당 됩니다 $NF
. 여기서는 NF
필드 구분 기호로 구분된 행의 필드 수입니다. 기본 필드 구분 기호( FS
)는 공백입니다. 공백은 FS
특별한 경우 awk
이며 연속된 여러 공백은 하나의 필드 구분 기호로 처리됩니다.
NF
필드 개수이므로 마지막 $NF
필드를 참조합니다. 이 경우 쌍에 대한 할당은 평가에서 얻은 값으로 대체 $NF
됩니다 .1
((c++ % count) + 1)
Final은 1
참 조건을 나타내며, 그 뒤의 코드 블록은 생략됩니다. print
조건이 참이면 그 효과는 암시적입니다. 항상 true이기 때문에 1
이 작업은 항상 수행되며 아마도 마지막 블록 전환 이후에 현재 줄이 인쇄됩니다.
프로세스를 더 잘 이해하기 위해 추적할 수 있습니다 awk
. awk
입력 라인을 반복하는 암시적 루프가 있습니다.
1행:
c
암시적 할당0
.c++
여전히 이지만 , is 모듈 로 로0
변경되고 is , is 로 변경되고 할당은 마지막 필드(이 경우 마지막 문자이기도 함)를 로 변경하여 궁극적으로 이 줄을 인쇄하므로 을 얻습니다 .c
1
(c++ % count)
0
3
0
((c++ % count)+1)
1
1
1
DS: 1
두 번째 줄:
c
이제1
.((c++ % count)+1)
이고 로2
변경됩니다 . 마지막 필드가 로 변경되어 인쇄되므로 을 얻습니다 .c
2
2
DS: 2
세 번째 줄: 마찬가지로 로
((c++ % count)+1)
변경 하고 로 평가합니다 . 우리는 얻었다 .c
3
3
DS: 3
4행: 이제
%
실제로 시행될 때입니다. 는 모듈로로 취해지며,(c++ %count)
와 같고 다시 로 평가됩니다 . 우리는 얻었다 .3
3
0
((c++%count)+1)
1
DS: 1
등. 이것이 작동하는 방식입니다. 없는 줄이 있으면 DS:
그대로 인쇄됩니다.