Подтвердить что ты не робот

Группа Awk/Unix

есть этот текстовый файл:

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

Попытка получить это (количество):

joe 1
jim 1
bob 2
mike 3

Спасибо,

4b9b3361

Ответ 1

$ 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 ключ

Ответ 2

Разделите строку заголовка, оставьте поле возраста, сгруппируйте одинаковые имена вместе (сортируйте), подсчитайте идентичные прогоны, выведите их в нужном формате.

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

Выход

bob 2
jim 1
joe 1
mike 3

Ответ 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

Ответ 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] }