Считайте количество уникальных значений на основе двух столбцов в электронной таблице

Я должен считать количество уникальных значений на основе двух столбцов в электронной таблице.

Предположим, что файл похож на это, заказанное по имени, фамилия, компания:

joe allen ibm
joe smith ibm
joe allen google
joe smith google
rachel allen google

И я должен считать количество уникальных имен для каждой компании при игнорировании фамилии:

joe ibm 2
joe google 2
rachel google 1

У меня есть этот код:

sort file.tsv | uniq -ci | awk '{print $2,$1}'

Если я просто удалю столбец фамилии, то тот код будет работать. Но если я не хочу удалять тот столбец, просто иметь awk, игнорируют его и сохраняют вывод в новый файл?

Данные разделяются вкладками \t

3
задан 14 March 2019 в 13:58

4 ответа

GNU awk решение с помощью двухмерных антенных решеток:

gawk -F $'\t' '{a[$1][$3]++} END {for (i in a) for (j in a[i]) print i, j, a[i][j]}' foo.txt
  • a[$1][$3]++ для каждой комбинации имени и фамилии, увеличьте количество
  • Затем цикл через имена и названия компаний, связанные с каждым именем.

Иначе это будет работать другой awks использование более старой формы многомерных массивов:

awk -F $'\t' '{a[$1, $3]++} END{for (i in a) {split (i, sep, SUBSEP); print sep[1], sep[2], a[i]}}' foo.txt
  • Так как старый метод на самом деле использует конкатенацию индексов, разделенных SUBSEP, мы должны разделить на SUBSEP возвращать исходные индексы.
2
ответ дан 1 December 2019 в 13:12

Вот решение Pythonic, использующее класс Counter модуля collections, который будет подсчитывать количество вхождений каждого элемента в итерируемое:

#!/usr/bin/env python2
import collections
with open('file.txt') as f:
    names = []
    for line in f:
        names.append(line.strip().split()[0] + ' ' + line.strip().split()[2])
    result_dict = collections.Counter(names)
    for person in result_dict:
        print person + ' ' + str(result_dict[person])
3
ответ дан 1 December 2019 в 13:12

Вы можете использовать cut для выбора столбцов, с которыми вы хотите работать в первую очередь. Поэтому, учитывая, что ваши столбцы разделены пробелом и являются FNAME SNAME COMPANY, в которых нас интересуют только столбцы 1 и 3, мы можем использовать:

cut -d' ' -f1,3 file.tsv | sort | uniq -ci

Это говорит cut о разделении с использованием одного пробела '' в качестве разделителя и для передачи столбцов 1 и 3 в сортировку.

Это даст некоторый результат, похожий на:

 cut -d' ' -f1,3 file.tsv | sort | uniq -ci
      2 joe google
      2 joe ibm
      1 rachel google
2
ответ дан 1 December 2019 в 13:12

Следующая острота жемчуга извлечет данные для Вас:

perl -e '/(.*)\t.*\t(.*)/ and $a{"$1 $2"}++ for (<>); print "$_ $a{$_}\n" foreach (keys%a);' file.tsv

Вывод:

joe ibm 2
joe google 2
rachel google 1
2
ответ дан 1 December 2019 в 13:12

Другие вопросы по тегам:

Похожие вопросы: