각 행을 계산하는 대신 열의 고유한 결과만 계산하려면 awk를 사용해 보세요.

각 행을 계산하는 대신 열의 고유한 결과만 계산하려면 awk를 사용해 보세요.

파일의 모든 행을 가져와 개수를 나열하는 스크립트가 있지만, 내가 원하는 것은 열 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

저는 두 가지 방법을 생각했습니다.

  1. 고유한 라인을 얻으 려면 sort:

    COMM_CONT=$(awk -F ',' '/COMM_CONT/{print $3;}' $1 | sort -u | wc -l)
    
  2. awk에서 작업 완료하기

    COMM_CONT=$(awk -F, '
        $3 ~ /COMM_CONT/ && !($3 in seen) {seen[$3]=1; count++}
        END {print count}
    ' $1)
    

관련 정보