0

I have a file looks like:

1
2 4 5 6 
20
22
24 26 27 
29 30 31 32 34 40 50 56 58
234 235 270 500
1234 1235 1236 1237
2300

I want to have an output showing me that there is 4 rows with 1 column, and 3 rows with 4 column and 1 row with 3 column and 1 row with 9 column. So, the output should be: rows ( columns)

4 (1)
1 (3)
3 (4)
1 (9)

considering that my real data is huge, any suggestion, please? Meanwhile, I want that maximum number of the column be shown in the last row (here 9) and a minimum number of column to be shown in the first row in output.

2

If you have a recent (> 4.0) version of GNU awk:

gawk '
  {a[NF]++} 
  END {
    PROCINFO["sorted_in"]="@ind_num_asc"; 
    for (i in a) printf "%d (%d)\n", a[i], i;
  }' file
4 (1)
1 (3)
3 (4)
1 (9)
2

gawk approach (using asorti function):

awk '{a[NF]++}END{ asorti(a,b); for(i in b) printf("%d (%d)\n",a[b[i]],b[i]) }' file

The output:

4 (1)
1 (3)
3 (4)
1 (9)

  • asorti(a,b) - sort an array by indices
1

If you treat each cell in your table as a placeholder to create the desired result, then you can sort and count duplicate lines to identify how many lines have same amount of columns.

a=$(sed 's/\([0-9]\+\)/1/g' file | sort | uniq -c)
dups=$( echo "$a" | cut -d' ' -f7 )

And after that you can count the words for each line to identify how many columns are in the row.

words=$(echo "$a" | cut -d' ' -f8- | awk '{print NF}')
paste <(echo "$dups") <(echo "$words")
4       1
1       3
3       4
1       9
1

The simplest version is

cat data.txt | awk '{counts[NF] += 1} END { for (row_count in counts) { printf "%d (%d)\n", counts[row_count], row_count; }'

It just uses NF variable which gives the number of fields in the line and updates the relevant value associated with it in the dictionary. Then at the end of the stream, it just iterates over all keys of the dictionary and prints them out in the requested format.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.