열 1의 고유 값 발생 증분 횟수를 인쇄하는 방법

열 1의 고유 값 발생 증분 횟수를 인쇄하는 방법

이 문제를 해결하려고 하는데, 개수를 늘린 다음 탭으로 구분된 텍스트 파일의 열 1에 있는 고유 값의 개수를 인쇄해야 합니다. 예는 다음과 같습니다.

Apple_1   1      300
Apple_2   1      500
Apple_2   500    1500
Apple_2   1500   2450
Apple_3   1      1250
Apple_3   1250   2000

원하는 출력은 다음과 같습니다.

Apple_1   1      300     1
Apple_2   1      500     1
Apple_2   500    1500    2
Apple_2   1500   2450    3
Apple_3   1      1250    1
Apple_3   1250   2000    2

NR을 인쇄하여 awk에서 행 번호를 인쇄할 수 있다는 것을 알고 있지만 열 1의 각 고유 값에 대해 이를 재설정하는 방법을 모르겠습니다.

귀하가 제공할 수 있는 도움에 감사드립니다.

답변1

이런 종류의 문제를 해결하기 위한 Awk의 표준 트릭은 연관 카운터 배열을 사용하는 것입니다:

awk '{ print $0 "\t" ++count[$1] }'

각 줄의 첫 번째 단어가 나타나는 횟수를 계산합니다. 이는 정확히 귀하가 요청한 내용이 아닙니다. 왜냐하면

Apple_1   1      300
Apple_2   1      500
Apple_1   500    1500

생산할 것입니다

Apple_1   1      300     1
Apple_2   1      500     1
Apple_1   500    1500    2

(보시다시피, 의 개수는 Apple_1재설정되지 않습니다 Apple_2.) 그러나 입력이 정렬되어 있으면 괜찮습니다.

그렇지 않으면 카운터와 마지막으로 본 키를 추적해야 합니다.

awk '{ if (word == $1) { counter++ } else { counter = 1; word = $1 }; print $0 "\t" counter }'

답변2

이 답변은 귀하가 지정한 정확한 결과를 제공하지 않습니다.그러나 다른 사용자가 더 관심을 가질 수 있습니다.


필요하지 않다면증가개수를 계산하지만 각 고유 값의 개수만 계산하면 더 간단한 것을 사용할 수 있습니다.

cut -f1 file.txt | sort | uniq -c

(이는 cut공백뿐만 아니라 탭 구분 기호에 따라 달라집니다.)


실제로 파일은 이미 첫 번째 필드에 정렬되어 있으므로 정렬할 필요가 없습니다.

cut -f1 file.txt | uniq -c

원본 파일의 새로운 네 번째 열로 포함하려면 다음을 사용할 수 있습니다 join.

cut -f1 file.txt | uniq -c | join -2 2 file.txt -

( join정렬된 입력에 따라 다름)

제공된 입력의 출력은 다음과 같습니다.

Apple_1 1 300 1
Apple_2 1 500 3
Apple_2 500 1500 3
Apple_2 1500 2450 3
Apple_3 1 1250 2
Apple_3 1250 2000 2

join공백 구분 기호(탭이든 공백이든)는 직관적으로 읽히지만 구분 기호 중 하나의 공백만 출력됩니다 . 탭을 복원하려면 다음으로 파이프하십시오.tr ' ' '\t'

관련 정보