есть около 52000 файлов, каждый приблизительно по 1 Мб.в каждой строке каждого файла есть поле т.н. "error code", для получения
awk -F"|" '{print $39}'Для получения всех уникальных "error code'ов" делаю так:
#!/bin/sh
d=/home/taskmng/bill/charge/abnormal
arr=(`ls $d|tr '\n' ' '`)
for (( i=0;i<${#arr[*]};i++ ))
do
if [ -e $d/${arr[$i]} ]
then
awk -F"|" '{print $39}' $d/${arr[$i]} | sort -u >> tmp
fi
done
cat tmp | sort -uЗадача:
как подсчитать сколько раз во всех файлах (52000) встречалась каждая ошибка?
буду благодарен хотя бы за алгоритм.
немного модифицировал скрипт, так по моему быстрее должно отрабатывать:
#!/bin/sh
d=/.../abnormal
arr=(`ls -rt $d|tail -1000|tr '\n' ' '`)
for (( i=0;i<${#arr[*]};i++ ))
do
if [ -e $d/${arr[$i]} ]
then
tmp=(`awk -F"|" '{print $39}' $d/${arr[$i]} | sort -u |tr '\n' ' '`)
for (( a=0;a<${#tmp[*]};a++ ))
do
err[${#err[*]}]="${tmp[$a]}"
done
fi
done
echo ${err[*]}|tr ' ' '\n'|sort -u|tee -a tmpЯ так понимаю процесс подсчета сколько раз встретилась каждая ошибка будет весьма непростым(
man sort
man uniq
> есть около 52000 файлов, каждый приблизительно по 1 Мб.Раз-раз?
> есть около 52000 файлов, каждый приблизительно по 1 Мб.
>> есть около 52000 файлов, каждый приблизительно по 1 Мб.
> Раз-раз?[[Чёй-та для зарегистрированных??! Совсем зажрались.]]
[CUT: платный Контент.]
printf"█ %s\n",a[e],e}' |sort -nr
█ --> % 8 d ///А у Вас квотинг и эскейпинг кривой! :-P
> printf"█ %s\n",a[e],e}' |sort -nr
> █ --> % 8 d ///А у Вас квотинг и эскейпинг кривой! :-PИзвините не понимаю о чём Вы?
Пока более изящного способа чем этот не придумал:
#!/bin/sh
d=/home/taskmng/bill/charge/abnormal
arr=(`ls -rt $d|tail -1000|tr '\n' ' '`)
case ${#arr[*]} in
0) echo $d
ls -lrt $d ;;
*) echo -e "from:\t`ls -l $d/${arr[0]}`\nTo:\t`ls -l $d/${arr[$(expr ${#arr[*]} - 1)]}`\nFiles:\t${#arr[*]}"
for (( i=0;i<${#arr[*]};i++ ))
do
if [ -e $d/${arr[$i]} ]
then
tmp=(`awk -F\| '{print $39}' $d/${arr[$i]} | sort | uniq -c | tr '\n' '@'`)
for (( a=0;a<${#tmp[*]};a++ ))
do
err=( "${err[@]}" "${tmp[$a]}" )
done
fi
done
tmp=(`echo ${err[*]}|tr '@' '\n'|awk '{print $2}'|sort -u|tr '\n' ' '`)
echo -e "Error\tCount"
for (( i=0;i<${#tmp[@]};i++ ))
do
count=(`echo ${err[*]} | tr '@' '\n' |awk '{if(index($0,"'${tmp[$i]}'"))print $1}'|tr '\n' ' '`)
for (( a=0;a<${#count[*]};a++ ))
do
let number+=${count[$a]}
done
echo -e "${tmp[$i]}\t$number" #|tee -a tmp
unset number
done ;;
esac
>> printf"█ %s\n",a[e],e}' |sort -nr
>> █ --> % 8 d ///А у Вас квотинг и эскейпинг кривой! :-P
> Извините не понимаю о чём Вы?Это разговоры с форумом при обострении. Не обращайте.
> Пока более изящного способа чем этот не придумал:
Ну, нет, так нет. Мне форум пишет, чтобы я шёл... регистрироваться.
Поэтому решение одной строкой из 90~ символов продолжает оставаться "платным контентом".
cat *allfiles* | awk -F"|" '{print $39}' | sort | uniq -c | sort -n
> cat *allfiles* | awk -F"|" '{print $39}' | sort | uniq -c
> | sort -nОгромное спасибо! Ваш способ действительно на много проще!
> cat *allfiles* | awk -F"|" '{print $39}' | sort | uniq -c
> | sort -nНикогда несколько сот мегабайт ч-з |sort|uniq -c не пропускал? Попробуй.
>> cat *allfiles* | awk -F"|" '{print $39}' | sort | uniq -c
>> | sort -n
> Никогда несколько сот мегабайт ч-з |sort|uniq -c не пропускал? Попробуй.Да оно даже раньше умрёт - на cat *allfiles* - там если не забыли 52000 штук заматчится :)
> Да оно даже раньше умрёт - на cat *allfiles* - там еслида ше вы сразу перепугались - это костяк решения а не само решение
> не забыли 52000 штук заматчится :)ноу проблем
find | xargs | cat | awk >> TMP_FILE
cat TMP_FILE | sort + uniq -c | sort
>> Раз-раз?
> [[Чёй-та для зарегистрированных??! Совсем зажрались.]]
> [CUT: платный Контент.]Два!
> есть около 52000 файлов, каждый приблизительно по 1 Мб.ЖB) забудь про |sort |uniq -c .... Не, ну можно, конечно попробивать. С 1 файлом, с 10, ... если утерпишь до конца, то пока пробуешь со 100, прикинуть, сколько будут пыхтеть 52K. Потом - Ctrl-C.
>> Раз-раз?
> [[Чёй-та для зарегистрированных??! Совсем зажрались.]]
> [CUT: платный Контент.]Три.
> #!/bin/sh
> d=/home/taskmng/bill/charge/abnormal
> arr=(`ls $d|tr '\n' ' '`)Этот tr--^ совсем не_ нужен. Я сказал.
>> Раз-раз?
> [[Чёй-та для зарегистрированных??! Совсем зажрались.]]
> [CUT: платный Контент.]Три с кисточкой. Уф...
> for (( i=0;i<${#arr[*]};i++ ))
> if [ -e $d/${arr[$i]} ]
> awk -F"|" '{print $39}' $d/${arr[$i]} | sort -u >> tmp
> cat tmp | sort -uls $d |xargs cat |awk -F"|" '{a[$39]++}END{for(e in a)printf"█ %s\n",a[e],e}' |sort -nr
█ --> % 8 d ///А у Вас квотинг и эскейпинг кривой! :-P
На здоровье! (Нет, не проверял. Сам -- если что не.)
> Задача:
> как подсчитать сколько раз во всех файлах (52000) встречалась каждая ошибка?
> буду благодарен хотя бы за алгоритм.Не студент? ТОчно не студент??
> Не студент? ТОчно не студент??52000 файлов? Лаборант. ;)