awk 첫 번째 열이 변경되면 숫자가 변경되는 새 열을 인쇄합니다.

awk 첫 번째 열이 변경되면 숫자가 변경되는 새 열을 인쇄합니다.

다른 사례를 토대로 직접 시도해 보았지만 실패했습니다. awk가 탭으로 구분된 파일을 다시 인쇄하기를 원하지만 끝에 1에서 시작하여 증가하는 추가 열을 추가하고 컬럼1이 동일하고 마지막 열이 컬럼1에 새 값이 있을 때 1로 재설정됩니다.

간단한 예, 열 1-3이 입력이고 출력에 마지막 열이 있는 경우:

A11R Q9Y5X3 SNX5  1
A12L Q9Y316 MEMO1 1
A12L Q70CQ2 USP34 2
A12L Q8N7H5 PAF1  3
A12L Q8IZL8 PELP1 4
A13L Q5SY16 NOL9  1
A13L Q6P1J9 CDC73 2
A13L Q8WVC0 LEO1  3
A13L Q9Y4W2 LAS1L 4
A13L Q6PD62 CTR9  5

먼저 파일을 읽고 열 1 값의 배열을 만든 다음 열 1이 이전 줄과 동일한 if 조건에 따라 파일을 인쇄해야 한다는 것을 알고 있습니다. i++

나는 시도했다:

awk '{A[++c] = $1} END {d=1; for ( i = 1; NR == i; i++ ) {if (A[i] = A[i-1]) {d++} else {d=1}; print d, $0}}'

그러나 분명히 작동 방식에 대한 기본 지식이 누락되었습니다.

답변1

$ awk -F '\t' 'BEGIN { OFS=FS } $1 != save { counter = 1; save = $1 } { print $0, counter++ }' file
A11R    Q9Y5X3  SNX5    1
A12L    Q9Y316  MEMO1   1
A12L    Q70CQ2  USP34   2
A12L    Q8N7H5  PAF1    3
A12L    Q8IZL8  PELP1   4
A13L    Q5SY16  NOL9    1
A13L    Q6P1J9  CDC73   2
A13L    Q8WVC0  LEO1    3
A13L    Q9Y4W2  LAS1L   4
A13L    Q6PD62  CTR9    5

코드 awk는 첫 번째 필드의 값을 에 기억된 값과 비교합니다 save. 값이 다른 경우 카운터는 counter1로 재설정되고 기억된 값은 첫 번째 필드의 값으로 업데이트됩니다.

그런 다음 행이 출력되고 카운터가 마지막 필드로 추가되고 증가됩니다.

답변2

귀하의 예에 따르면 첫 번째 필드의 값과 마지막 실행의 카운터 변수만 기억하면 됩니다.

awk -F'\t' 'BEGIN{ OFS=FS }
{
  # if same field, increment counter, else reset counter
  count=(last==$1 ? ++count : 1)

  # remember first field
  last=$1
  
  print $0, count
}' file

답변3

밀러를 사용하여:

$ mlr --tsv -N step -a counter -f 1 -g 1 file

-N파일 제목이 없습니다.

step동사는 연속된 레코드(counter, ewma 등) 사이에서 무언가를 계산하는 데 사용되며 레코드의 일부 필드로 그룹화될 수 있습니다.

다음 명령은 비슷한 결과를 제공하지만 카운터가 첫 번째 필드로 추가됩니다.

$ mlr --tsv -N cat -n -g 1 file

관련 정보