Количество количества другого имени в файле

Я хочу считать количество другого имени в текстовом файле этой презентации:

2008 girl Avah
2009 girl Avah
2008 girl Carleigh
2011 girl Kenley
2012 boy Joseph
2013 boy Joseph
2014 boy Isaac
2014 boy Brandon

Так же в основном я хочу пропустить дубликат и иметь как ответ 6. Я попробовал awk для доступа только к третьему столбцу, но я не могу заставить это печатать количество строк.

5
задан 3 October 2019 в 21:56

4 ответа

с awk:

<fileName awk '!nameSeen[$3]++{ count++ } END{ print count }'

если новое имя найдено !nameSeen[$3]++ инкрементный счетчик count++ и в END распечатайте встречное значение.

6
ответ дан 23 November 2019 в 08:41

Так как Ваш файл, кажется, предварительно отсортирован на столбце имени, Вы могли использовать uniq с -f (--skip-fields) опция произвести только первую строку каждого имени и строки количества:

uniq -f2 FileName | wc -l

или

uniq --skip-fields=2 FileName | wc -l

Если Ваши данные не предварительно отсортированы, можно объединиться sort -u с a -k полевая спецификация для достижения того же самого (хотя это ясно не документируется в GNU sort страница справочника):

sort -uk3 FileName | wc -l

Это - излишество для этой задачи, однако Вы могли также использовать GNU Датамаш:

datamash -W countunique 3 < FileName
6
ответ дан 23 November 2019 в 08:41

Действительно короткий и простой способ, с помощью Miller (https://github.com/johnkerl/miller)

mlr --nidx uniq -g 3 -n input.txt
2
ответ дан 23 November 2019 в 08:41

Довольно простой быстрый путь, который объясняется:

cat FileName | sed 's/[0-9]*//g' | sed 's/\<boy\>//g' | sed 's/\<girl\>//g' | sort -u | wc -l

Или удовлетворить озабоченность αғsнιη по поводу UUoC:

<FileName sed 's/[0-9]*//g' | sed 's/\<boy\>//g' | sed 's/\<girl\>//g' | sort -u | wc -l

Или другой UUoC совместимая команда:

sed 's/[0-9]*//g' <FileName | sed 's/\<boy\>//g' | sed 's/\<girl\>//g' | sort -u | wc -l

Уведомление @Rebi Khalifa:

αғsнιη справедливо записал в комментариях ниже:

или <fileName cut -d' ' -f3 |sort -u |wc -l; cat filename | ... UUoC

@steeldriver справедливо записал в комментариях ниже:

Я предложил бы использовать cut вместо всех они sed команды - необходимо, по крайней мере, объединить их в единственный вызов напр. sed -E -e 's/^[0-9]+//' -e 's/\b(boy|girl)\b//'

Они оба использовали полевой подход выбора, который является тем же подходом, который Вы пытались реализовать для решения проблемы на основе того, что Вы записали в своем вопросе:

Я пытался awk получить доступ только к третьему столбцу, но я не могу заставить его печатать количество строк.


Не нужно быть сложным для добиваний цели в Ubuntu! Вещи могут быть сделаны многими невообразимыми способами.

Один путь, который хвалит принцип KISS, состоит в том, чтобы передать по каналу | выполняются простые команды одна к следующему до миссии:

  • Считайте содержание файла с cat FileName -->
  • Передайте его по каналу | -->
  • Удалите группы числа с sed 's/[0-9]*//g' -->
  • Передайте его по каналу | -->
  • Удалите мальчика слова с sed 's/\<boy\>//g' -->
  • Передайте его по каналу | -->
  • Удалите девочку слова с sed 's/\<girl\>//g' -->
  • Только имена оставляют теперь...->
  • Передайте его по каналу | -->
  • Отсортируйте имена и удалите дубликаты с sort -u -->
  • Только площадь уникальных имен уехала теперь->
  • Передайте его по каналу | -->
  • Считайте строки с wc -l -->
  • Готово
2
ответ дан 23 November 2019 в 08:41

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

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