追加

追加

3つの列を持つTSVタブで区切られたファイルがあります。

ID\tTEXT\tTYPE

TYPEマイコラム印刷

cat /dataset.csv | awk -F $'\t' '{print $3}'

値は等しい列挙型です{CLASS_A,CLASS_B,CLASS_C}

NF列挙型の各値を一致させるときに列 (?) の発生回数を計算する AWK のインライン方式を使用して、以下を取得する必要があります。TYPE

CLASS_A 1300
CLASS_B 450
CLASS_C 988

【書き直す】

以下のソリューションに基づいて、このスクリプトの最後のバージョンをここに配置しました。

#!/bin/bash

COL=$1
FILE=$2

awk -v col="$COL" -F $'\t' '   {c[$col]++}
                 END{
                     for (i in c) printf("%s\t%s\n",i,c[i])
                 }' $FILE

列 3 で行の発生回数を計算する使用法は次のとおりです。

$ ./count_cols.sh 3 /myfile.csv

答え1

catファイルを読むために使用する必要はありません。 AWKは完全に読むことができます。

コアc[$3]++ステートメントは各タイプの行数を取得する必要があります。
次に、最後にすべての数をタブ区切りの値として印刷します。

#!/bin/bash

awk -F '\t' '   {c[$3]++}
                 END{
                     for (i in c) printf("%s\t%s\n",i,c[i])
                 }' dataset.csv 

追加

OPの意見を考えると、次のようになります。

引用符付きの列にはいくつかの問題があります。that doesn\'t mean that you\'re not worth remembering think of the people who need to know they need to know so you need ​to show....この場合、\ tの解析は失敗します。

答えを確認する必要があります。このファイルを作成しました。

$ cat dataset.csv 
1233    that doesn\'t mean that you\'re not worth remembering think of the people who need to know they need to know so you need to show...    CLASS_0
1234    here    CLASS_A
1235    goes the values CLASS_B
1236    "that need counting"    CLASS_B
1237    "\like \this"   CLASS_B
1238    \or \this       CLASS_C
1239    including spaces        CLASS_B
1240    but not tabs    CLASS_A
1241    which could not work    CLASS_B
1242    finally CLASS_C
1243    this is CLASS_A
1244    over    CLASS_B
1245    988     CLASS_C

このファイルは、スクリプトで使用すると正しい結果を提供します。

$ ./script
CLASS_A 3
CLASS_B 6
CLASS_C 3
CLASS_0 1

これが正しい結果です。

もちろんファイルは

  1. tabs正しい数の3つのフィールドがあります。
  2. 拡張時に変数は正しく引用され、大文字で表示されません。

ファイルが最初の要件を満たしているかどうかをテストするには、次のスクリプトを使用できます。

#!/bin/bash

filetoread="$2"

<"$filetoread" tr -dc '\t\n' |
    awk '(length!=2){printf("Error in line: %s, has %s tabs\n",NR,length)}'

awk -F '\t' '(NF!=3){printf("Error in line: %s, has %s fields\n",NR,NF)}' "$filetoread"

1行に2つのタブがあることを確認し、フィールド数
(awkで示すように)が実際に3であることを確認します。

数行のテスト行を追加します。

… …
1239    including spaces        CLASS_B
1       but not     tabs    CLASS_A
2       but not \ttabs  CLASS_A
1240    but not tabs    CLASS_A
… …

そして上記のスクリプトを実行してください:

$ ./script 3 dataset.csv
Error in line: 8, has 4 tabs
Error in line: 8, has 5 fields

4つのタブ(2つが追加されている)を持つ行ID 1が検出され、タグ付けされていません\t

変数の参照や使用は、自分が直接改善する必要があります。

答え2

次の操作が実行されます。

awk -F'\t' ' 
            $3=="CLASS_A" {a+=1} 
            $3=="CLASS_B" {b+=1} 
            $3=="CLASS_C" {c+=1} 
            END {
                printf "%s %d\n%s %d\n%s %d", CLASS_A,a,CLASS_B,b,CLASS_C,c
            }' /dataset.csv

答え3

列3に「CLASS_A」、「CLASS_B」、または「CLASS_C」を含めることができることを正しく理解してください。

それから

awk -F'\t'  '
 { seen[$3]++ ;}
 END { for (i in seen) {
         printf "%s : %s\n",i,seen[i]
       }
      } 
 ' /dataset.csv

これを行う必要がありますか?

「for(i in saw)」は「正しい順序」で読み取られることを保証しませんが、1つを追加して| sort(全体のawkの後ろに)並べ替えるか、より複雑なトリックを使用できます(awk Insideで)。

最初の行もスキップする必要がある場合(ヘッダーが含まれている場合など)次へ追加awkスクリプトの最初の行の前に:

( NR==1 ) { next ;}

または、最初の行を次のように変更します。

( NR > 1 ) { seen[$3]++ ;}

関連情報