追加

追加

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

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

おすすめ記事