次のテキスト ファイルがあります。
name, age
joe,42
jim,20
bob,15
mike,24
mike,15
mike,54
bob,21
これを取得しようとしています(カウント):
joe 1
jim 1
bob 2
mike 3
ありがとう、
$ awk -F, 'NR>1{arr[$1]++}END{for (a in arr) print a, arr[a]}' file.txt
joe 1
jim 1
mike 3
bob 2
-F,
分割します,
NR>1
1 行目以降の行を処理するarr[$1]++
最初の列をキーとして配列をインクリメントarr
( で分割),
END{}
ブロックはファイルの処理の最後に実行されますfor (a in arr)
キーarr
で繰り返すa
print a
キーでキー, arr[a]
配列を印刷するa
ヘッダー行を削除し、年齢フィールドを削除し、同じ名前をグループ化 (ソート) し、同一のランをカウントし、目的の形式で出力します。
tail -n +2 txt.txt | cut -d',' -f 1 | sort | uniq -c | awk '{ print $2, $1 }'
出力
bob 2
jim 1
joe 1
mike 3
ソートされた出力が必要なようです。単純にパイプするか、次のように出力できますsort -nk 2
。
awk -F, 'NR>1 { a[$1]++ } END { for (i in a) print i, a[i] | "sort -nk 2" }' file
結果:
jim 1
joe 1
bob 2
mike 3
ただし、GNU awk
インストールしている場合は、coreutils なしでソートを実行できます。配列をその値でソートする単一プロセスのソリューションを次に示します。解決策はまだ非常に迅速なはずです。次のように実行します。
awk -f script.awk file
の内容script.awk
:
BEGIN {
FS=","
}
NR>1 {
a[$1]++
}
END {
for (i in a) {
b[a[i],i] = i
}
n = asorti(b)
for (i=1;i<=n;i++) {
split (b[i], c, SUBSEP)
d[++x] = c[2]
}
for (j=1;j<=n;j++) {
print d[j], a[d[j]]
}
}
結果:
jim 1
joe 1
bob 2
mike 3
または、ここにワンライナーがあります:
awk -F, 'NR>1 { a[$1]++ } END { for (i in a) b[a[i],i] = i; n = asorti(b); for (i=1;i<=n;i++) { split (b[i], c, SUBSEP); d[++x] = c[2] } for (j=1;j<=n;j++) print d[j], a[d[j]] }' file
厳密に awk ソリューション...
BEGIN { FS = "," }
{ ++x[$1] }
END { for(i in x) print i, x[i] }
本当にファイルにある場合name, age
は、 awk プログラムを調整して無視することができます...
BEGIN { FS = "," }
/[0-9]/ { ++x[$1] }
END { for(i in x) print i, x[i] }
猫ファイル.txt | カット -d',' -f 1 | ソート | ユニーク -c
2 bob
1 jim
1 joe
3 mike