Как насчет этого. Одиночный запуск 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
$
Для этого вам не нужен 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