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
これが正しい結果です。
もちろんファイルは
tabs
正しい数の3つのフィールドがあります。- 拡張時に変数は正しく引用され、大文字で表示されません。
ファイルが最初の要件を満たしているかどうかをテストするには、次のスクリプトを使用できます。
#!/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]++ ;}