Необходимо извлечь желаемый результат - PullRequest
0 голосов
/ 28 мая 2020

У меня есть 100 подкаталогов, заканчивающихся шаблоном * _t, где в каждом подкаталоге у меня есть файл Error.log, который выглядит ниже

code                | error      | type      |

---                 | NTL_CON08  | Fatal     |
---                 | NTL_STR33  | Fatal     |
---                 | NTL_STR33  | Fatal     |
---                 | W_123      | Fatal     |
---                 | ER_130     | Fatal     |

Мне нужен результат, как показано ниже, где я показываю вывод одного подкаталога

acp_sub_t   
--------------------
NTL_CON08   1
NTL_STR33   2

Total Errors:   3

Я пробовал код ниже

#!/bin/bash
for d in *_t
do
 echo "$d"
 awk '{print $2}' Error.log | sort | uniq -c
done

Но я не получаю точного вывода, как указано выше. Пожалуйста, помогите мне

1 Ответ

3 голосов
/ 28 мая 2020

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...