Я должен считать количество уникальных значений на основе двух столбцов в электронной таблице.
Предположим, что файл похож на это, заказанное по имени, фамилия, компания:
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
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]++
для каждой комбинации имени и фамилии, увеличьте количествоИначе это будет работать другой awk
s использование более старой формы многомерных массивов:
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
возвращать исходные индексы. Вот решение 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])
Вы можете использовать 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
Следующая острота жемчуга извлечет данные для Вас:
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