![각 행을 계산하는 대신 열의 고유한 결과만 계산하려면 awk를 사용해 보세요.](https://linux55.com/image/189402/%EA%B0%81%20%ED%96%89%EC%9D%84%20%EA%B3%84%EC%82%B0%ED%95%98%EB%8A%94%20%EB%8C%80%EC%8B%A0%20%EC%97%B4%EC%9D%98%20%EA%B3%A0%EC%9C%A0%ED%95%9C%20%EA%B2%B0%EA%B3%BC%EB%A7%8C%20%EA%B3%84%EC%82%B0%ED%95%98%EB%A0%A4%EB%A9%B4%20awk%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%B4%20%EB%B3%B4%EC%84%B8%EC%9A%94..png)
파일의 모든 행을 가져와 개수를 나열하는 스크립트가 있지만, 내가 원하는 것은 열 3의 고유한 인스턴스만 가져오는 것입니다. 예를 들어 행은 아래 그림과 같은 것을 나타내며 현재 스크립트는 COMM_CONT의 모든 인스턴스를 계산하지만 실제로 원하는 것은 COMM_CONT가 있는 유일한 행(그림에서는 2)을 계산하는 것입니다.
따라서 아래 스크립트에서 네 가지 패턴이 발생하는 고유한 횟수를 계산하기를 원합니다. 나는 이것이 간단한 수정이어야 한다고 생각하지만 -u 및 -uniq를 시도했지만 그렇게 할 수 없는 것 같습니다.
#!/bin/bash
ORAL_MICRO=$(awk -F ',' '/ORAL_MICRO/{print $3;}' $1 | wc -l)
LAB_CONT=$(awk -F ',' '/LAB_CONT/{print $3;}' $1 | wc -l)
COMM_CONT=$(awk -F ',' '/COMM_CONT/{print $3;}' $1 | wc -l)
IMMUNE=$(awk -F ',' '/IMMUNE/{print $3;}' $1 | wc -l)
echo $1, $ORAL_MICRO, $LAB_CONT, $COMM_CONT, $IMMUNE >> $2
답변1
저는 두 가지 방법을 생각했습니다.
고유한 라인을 얻으 려면
sort
:COMM_CONT=$(awk -F ',' '/COMM_CONT/{print $3;}' $1 | sort -u | wc -l)
awk에서 작업 완료하기
COMM_CONT=$(awk -F, ' $3 ~ /COMM_CONT/ && !($3 in seen) {seen[$3]=1; count++} END {print count} ' $1)