Count number of different name in a file

Solution 1:

with awk:

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

if new name found !nameSeen[$3]++ increment counter count++ and at the END print counter value.

Solution 2:

Since your file appears to be pre-sorted on the name column, you could use uniq with the -f (--skip-fields) option to output only the first line of each name, and count lines:

uniq -f2 FileName | wc -l

or

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

If your data are not pre-sorted, you can combine sort -u with a -k field specification to achieve the same thing (although it's not clearly documented in the GNU sort man page):

sort -uk3 FileName | wc -l

It's overkill for this task, however you could also use GNU Datamash:

datamash -W countunique 3 < FileName

Solution 3:

A really short and easy way, using Miller (https://github.com/johnkerl/miller)

mlr --nidx uniq -g 3 -n input.txt

Solution 4:

A rather simple quick way that explains itself:

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

Or to satisfy @αғsнιη's concern about UUoC:

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

Or another UUoC compliant command:

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

A notice to @Rebi Khalifa:

@αғsнιη rightly wrote in the comments below:

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

@steeldriver rightly wrote in the comments below:

I'd suggest using cut rather than all those sed commands - you should at least combine them into a single invocation ex. sed -E -e 's/^[0-9]+//' -e 's/\b(boy|girl)\b//'

They both used field selection approach which is the same approach you were trying to implement to solve your issue based on what you wrote in your question:

I tried with awk to access only the third column but I can't get it to print the number of lines.


One does not need to be sophisticated to get things done in Ubuntu! Things can be done in many unimaginable ways.

One way which praises the KISS principle is to pipe | simple commands one to the next until mission is accomplished:

  • Read the content of the file with cat FileName -->
  • Pipe it | -->
  • Remove number groups with sed 's/[0-9]*//g' -->
  • Pipe it | -->
  • Remove the word boy with sed 's/\<boy\>//g' -->
  • Pipe it | -->
  • Remove the word girl with sed 's/\<girl\>//g' -->
  • Only names are left now... -->
  • Pipe it | -->
  • Sort the names and remove duplicates with sort -u -->
  • Only unique names ar left now -->
  • Pipe it | -->
  • Count the lines with wc -l -->
  • Done