AWK commands to parse file and list output in alphabetical format including count of each item

Viewed 77

Input file (called RESample.txt) contains

Rogue Exiles by name this session:           
Rogue Exiles by name this session:           OG VG
Rogue Exiles by name this session:           
Rogue Exiles by name this session:           
Rogue Exiles by name this session:           
Rogue Exiles by name this session:           MS
Rogue Exiles by name this session:           AB TM
Rogue Exiles by name this session:           
Rogue Exiles by name this session:           AR UM
Rogue Exiles by name this session:           MA
Rogue Exiles by name this session:           
Rogue Exiles by name this session:           
Rogue Exiles by name this session:           
Rogue Exiles by name this session:           
Rogue Exiles by name this session:           
Rogue Exiles by name this session:           
Rogue Exiles by name this session:           UM UM EG TO AV OG
Rogue Exiles by name this session:           AG AB OG
Rogue Exiles by name this session:           
Rogue Exiles by name this session:           
Rogue Exiles by name this session:           
Rogue Exiles by name this session:           TH TM
Rogue Exiles by name this session:           JU OG
Rogue Exiles by name this session:           OG
Rogue Exiles by name this session:           TM
Rogue Exiles by name this session:           OG TO
Rogue Exiles by name this session:           TH AV VA
Rogue Exiles by name this session:           TH UT KO VA
Rogue Exiles by name this session:           TM UT
Rogue Exiles by name this session:           MA TO
Rogue Exiles by name this session:           
Rogue Exiles by name this session:           OO
Rogue Exiles by name this session:           DL TH
Rogue Exiles by name this session:           
Rogue Exiles by name this session:           TH TO ID AS XB AR
Rogue Exiles by name this session:           KO
Rogue Exiles by name this session:           
Rogue Exiles by name this session:           OG AB ?
Rogue Exiles by name this session:           VA AS
Rogue Exiles by name this session:           EG
Rogue Exiles by name this session:           
Rogue Exiles by name this session:           ID AS
Rogue Exiles by name this session:           ID AS TI
Rogue Exiles by name this session:           VM AN
Rogue Exiles by name this session:           AB AV
Rogue Exiles by name this session:           ID
Rogue Exiles by name this session:           TO TM AR AS
Rogue Exiles by name this session:           XB
Rogue Exiles by name this session:           OO
Rogue Exiles by name this session:           TM
Rogue Exiles by name this session:  
Rogue Exiles by name this session:           ? MA
Rogue Exiles by name this session:           TH UT
Rogue Exiles by name this session:           ZD AB UM
Rogue Exiles by name this session:           AN UM
Rogue Exiles by name this session:           ST AR AV
Rogue Exiles by name this session:           UM
Rogue Exiles by name this session:           MS
Rogue Exiles by name this session:           ST
Rogue Exiles by name this session:           OG
Rogue Exiles by name this session:           AB
Rogue Exiles by name this session:           AN
Rogue Exiles by name this session:           AN OO
Rogue Exiles by name this session:           ID
Rogue Exiles by name this session:           TO
Rogue Exiles by name this session:           UM
Rogue Exiles by name this session:           EG
Rogue Exiles by name this session:           VA AR ? OG


Desired output is
AB (6)
AR (4)
MA (3)
OG (9)
?  (3)
Blank (19)

This awk command gets me someway to desired output grep 'by name' RESample.txt|awk '{ORS=" "; for(i=7;i<=NF;i++) print $i}'|awk '{split ($0,POE); print POE[1]; print POE[2]; print POE[3]}' but I don't know how to finish the command to get the entire array plus the count of each value as desired.

I also tried this command grep 'by name' RESample.txt|awk '{ORS=" "; for(i=7;i<=NF;i++) print $i}'|awk '{POE[$0]++;} END { for (i in POE) print i, POE[i];}' but this prints a whole line and a count of only the last item in the array and doesn't count blank entries (UM EG VA AR ? OG 1), not the desired output.

What command(s) do I need to process the input field with awk properly and get it to spit out the desired output ?

Update - this command gives me output in alphabetical order - run against all the values I had (I can live without values in brackets)

grep 'by name' RESample.txt|awk '{POE[$7]++;} END { for (i in POE) print i, POE[i];}'|sort

 19
? 1
AB 3
AG 1
AN 3
AR 1
DL 1
EG 2
ID 4
JU 1
KO 1
MA 2
MS 2
OG 5
OO 2
ST 2
TH 5
TM 3
TO 2
UM 3
VA 2
VM 1
XB 1
ZD 1

but the count is off on some. The ? for example should be 3, not 1, but other values are what they should be.

1 Answers

Could you please try following, written and tested with shown samples in GNU awk. Written and tested in link https://ideone.com/gfilsQ#stdin

awk '
{
  sub(/.*this session: +/,"")
  if(!NF){ arr["UnKnown"]++ } 
  for(j=1;j<=NF;j++){
    arr[$j]++
  }
}
END{
  for(k in arr){
      print k,"("arr[k]")"
  }
}' Input_file
Related