Я хочу считать количество другого имени в текстовом файле этой презентации:
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
для доступа только к третьему столбцу, но я не могу заставить это печатать количество строк.
с awk
:
<fileName awk '!nameSeen[$3]++{ count++ } END{ print count }'
если новое имя найдено !nameSeen[$3]++
инкрементный счетчик count++
и в END
распечатайте встречное значение.
Так как Ваш файл, кажется, предварительно отсортирован на столбце имени, Вы могли использовать 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
Действительно короткий и простой способ, с помощью Miller (https://github.com/johnkerl/miller)
mlr --nidx uniq -g 3 -n input.txt
Довольно простой быстрый путь, который объясняется:
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
-->