awk + как считать слова в первом поле

Как насчет этого. Одиночный запуск awk, так что, вероятно, довольно быстро по сравнению с исходным сценарием.

$ awk -F/ 'BEGIN{print "DOM,    PROJ, CFG,      LOOKUP NAME VALUE(s)"}/source\/EDDG/{a=$2", "$3", "substr($8,0,length($8)-2)", "}/lookup_name/{gsub(/^.*value="/,"");gsub(/".*/,"");print a$0}' 4.txt
DOM,    PROJ, CFG,      LOOKUP NAME VALUE(s)
source, EDDG, test.cfg, CUSTOMER_1
source, EDDG, test.cfg, CODE_1
$

Или отформатировать более красиво:

$ awk -F/ 'BEGIN {
            print "DOM,    PROJ, CFG,      LOOKUP NAME VALUE(s)"
           }
           /source\/EDDG/ {
            a=$2", "$3", "substr($8,0,length($8)-2)", "}
           /lookup_name/ {
            gsub(/^.*value="/,"")
            gsub(/".*/,"")
            print a$0
           }' 4.txt
DOM,    PROJ, CFG,      LOOKUP NAME VALUE(s)
source, EDDG, test.cfg, CUSTOMER_1
source, EDDG, test.cfg, CODE_1
$
-6
13.01.2021, 14:15
1 ответ

Для этого вам не нужен awk, вы можете просто сделать:

$ sort file | uniq -c
      5 car12
      3 car55
      2 car65
      1 car87
      1 car98

Но да, это возможно и в awk:

$ awk '{a[$1]++}END{for(word in a){print word" - "a[word]}}' file 
car55 - 3
car65 - 2
car87 - 1
car12 - 5
car98 - 1

С помощью GNU awk(gawk)можно даже использовать несколько предопределенных сортировок в отношении того, как проходится массив и, соответственно, как он печатается. Если вы используете PROCINFO["sorted_in"]="@ind_str_asc", это приведет к тому, что результаты будут распечатаны в порядке от наиболее просматриваемых до наименее :

.
$ awk '{a[$1]++} 
       END { 
        PROCINFO["sorted_in"]="@ind_str_asc";
        for(word in a){print word" - "a[word]}
       }' file
car12 - 5
car55 - 3
car65 - 2
car87 - 1
car98 - 1
5
18.03.2021, 22:36

Теги

Похожие вопросы