1-е решение (РЕДАКТИРОВАТЬ): Если у вас есть GNU awk
с ENDFILE
, вы можете сделать это с помощью одного awk
самого.
awk '
FNR==1{
dir_name=FILENAME
sub(/\/.*/,"",dir_name)
}
$3=="error"{ next }
NF{
count[$3]++
}
ENDFILE{
print dir_name ORS "--------------------"
for(i in count){
print i,count[i]
sum+=count[i]
}
print "Total Errors: " sum
delete count
sum=dir_name=""
}
' *_t/error.log
Доказательство концепции: Когда я запускаю выше, получаю следующий результат для тестовых каталогов и тестовых (образцов) файлов в 2 каталогах.
1_t
--------------------
NTL_STR33 2
NTL_CON08 1
Total Errors: 3
2_t
--------------------
NTL_STR33 2
NTL_CON08 1
Total Errors: 3
2-е решение: Исходя из показанных вами образцов, не могли бы вы попробовать следующее. Не удалось протестировать, так как у меня нет структуры каталогов, как упомянуто, должно работать, но.
Исправление попытки OP здесь, справедливое предупреждение с использованием awk
в for
l oop обычно не рекомендуется эксперты с тех пор, как OP использовали этот метод, поэтому пытаются исправить его здесь.
for dir in *_t
do
awk -v di="$dir" '
$3=="error"{ next }
NF{
count[$3]++
}
END{
print di ORS "--------------------"
for(i in count){
print i,count[i]
sum+=count[i]
}
print "Total Errors: " sum
}' "$dir"/error.log
done