45

次のテキスト ファイルがあります。

name, age
joe,42
jim,20
bob,15
mike,24
mike,15
mike,54
bob,21

これを取得しようとしています(カウント):

joe 1
jim 1
bob 2
mike 3

ありがとう、

4

6 に答える 6

105
$ 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>11 行目以降の行を処理する
  • arr[$1]++最初の列をキーとして配列をインクリメントarr( で分割),
  • END{}ブロックはファイルの処理の最後に実行されます
  • for (a in arr)キーarrで繰り返すa
  • print aキーでキー, arr[a]配列を印刷するa
于 2013-02-17T00:50:24.927 に答える
28

ヘッダー行を削除し、年齢フィールドを削除し、同じ名前をグループ化 (ソート) し、同一のランをカウントし、目的の形式で出力します。

tail -n +2 txt.txt | cut -d',' -f 1 | sort | uniq -c | awk '{ print $2, $1 }'

出力

bob 2
jim 1
joe 1
mike 3
于 2013-02-17T00:44:27.650 に答える
10

ソートされた出力が必要なようです。単純にパイプするか、次のように出力できます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
于 2013-02-17T01:50:39.317 に答える
4

厳密に 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] }
于 2013-02-17T00:49:13.563 に答える
0

猫ファイル.txt | カット -d',' -f 1 | ソート | ユニーク -c

2 bob
1 jim
1 joe
3 mike
于 2020-11-25T17:14:55.403 に答える