各行を計算するのではなく、列の固有の結果のみを計算するには、awkを使用してみてください。

各行を計算するのではなく、列の固有の結果のみを計算するには、awkを使用してみてください。

ファイルのすべての行を取得し、数をリストするスクリプトがありますが、私が望むのは、列3の一意のインスタンスのみを取得することです。たとえば、行は下の図のようなものを表し、現在のスクリプトはCOMM_CONTのすべてのインスタンスを計算しますが、実際に必要なのはCOMM_CONTがある唯一の行(図では2)を計算することです。

ここに画像の説明を入力してください。

したがって、以下のスクリプトで4つのパターンが発生する一意の回数を計算したいと思います。私はこれが簡単な修正でなければならないと思いますが、-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

私は2つの方法を考えました。

  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)
    

関連情報