순차적 교체 패턴에 대한 awk 쿼리

순차적 교체 패턴에 대한 awk 쿼리

파일의 특정 줄을 순차적으로 바꾸는 다음 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에 할당됩니다.쉘 변수및 에 액세스할 수 없으며 암시적으로 로 초기화되므로 awk0으로 나누기 오류가 발생합니다 .count0

존재하다

/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 로 변경되고 할당은 마지막 필드(이 경우 마지막 문자이기도 함)를 로 변경하여 궁극적으로 이 줄을 인쇄하므로 을 얻습니다 .c1(c++ % count)030((c++ % count)+1)111DS: 1

  • 두 번째 줄: c이제 1. ((c++ % count)+1)이고 로 2변경됩니다 . 마지막 필드가 로 변경되어 인쇄되므로 을 얻습니다 .c22DS: 2

  • 세 번째 줄: 마찬가지로 로 ((c++ % count)+1)변경 하고 로 평가합니다 . 우리는 얻었다 .c33DS: 3

  • 4행: 이제 %실제로 시행될 때입니다. 는 모듈로로 취해지며, (c++ %count)와 같고 다시 로 평가됩니다 . 우리는 얻었다 .330((c++%count)+1)1DS: 1

등. 이것이 작동하는 방식입니다. 없는 줄이 있으면 DS:그대로 인쇄됩니다.

관련 정보