Count the number of fields per line

From raju

Task

The task here is to count the number of fields in each line of a file. Consider for example

% cat isp.txt 
# Below is a sample list of isps. Each line contains two to four fields
# separated by a ','.

Northrop Grumman Corp., United States
Thomson Reuters (legal), United States
Time Warner Cable, United States
Tw Telecom Holdings, United States
Windstream Business, United States

Raytheon Company, Arizona, United States
Intel Corporation, California, United States
Rcn, New York, United States
Peak 10, South Carolina, United States

Charter Communications, Birmingham, Alabama, United States
Google, Mountain View, California, United States
Comcast Cable, Brewster, New York, United States
Optimum Online, Bronx, New York, United States
Choopa Llc, Miami, Florida, United States
Quadranet, Miami, Florida, United States

We want to get the distribution of isp entries by the number of fields. That is we want to know how many lines have just two fields, how many have three and how many have four etc.,

Solution

% cat isp.txt | grep -v "^$" | grep -v '^#' | awk '{print NF}' FS=,  | sort | uniq -c
      5 2
      4 3
      6 4

which shows that there 5 lines with two fields, 4 lines with 3 fields, 6 lines with 4 fields.

How the command works

grep -v "^$" - remvoes empty lines
grep -v '^#' - removes lines starting with '#'
awk '{print NF}' prints the number of fields in each line
  FS=, specifies the field separator
uniq prints the unique values in a sorted vector
  -c shows the count of each unique value.

Related links