Команды AWK для анализа выходных данных файлов и списков в алфавитном формате, включая количество каждого элемента

#awk

#awk

Вопрос:

Входной файл (вызывается RESample.txt ) содержит

 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)
  

Эта команда awk каким-то образом приводит меня к желаемому результату
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]}'
но я не знаю, как завершить команду, чтобы получить весь массив плюс количество каждого значения по желанию.

Я также пробовал эту команду 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];}' , но она выводит целую строку и количество только последнего элемента в массиве и не учитывает пустые записи (НАПРИМЕР, VA AR? OG 1), не желаемый результат.

Какие команды мне нужны, чтобы правильно обработать поле ввода с помощью awk и заставить его выдать желаемый результат?

Обновление — эта команда выдает мне выходные данные в алфавитном порядке — выполняется со всеми значениями, которые у меня были (я могу жить без значений в скобках)

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
  

но для некоторых количество отключено. Что? например, должно быть 3, а не 1, но другие значения такие, какими они должны быть.

Ответ №1:

Не могли бы вы, пожалуйста, попробовать следующее, написанное и протестированное с показанными примерами в GNU awk . Написано и протестировано по ссылке 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