이 문제를 해결하려고 하는데, 개수를 늘린 다음 탭으로 구분된 텍스트 파일의 열 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'