Никогда не используйте слово «шаблон» в этом контексте, так как оно весьма двусмысленно, всегда используйте «строку» или «регулярное выражение», что бы вы ни имели в виду (см. как -сделать -i -найдите -текст --, который -соответствует -шаблону -для получения дополнительной информации ).
Похоже, вы пытаетесь выполнить полное сопоставление строк, но используете оператор регулярного выражения(~
)и динамическое регулярное выражение без границ (pattern
), отсюда и ваша проблема.
Избавьтесь от окружающих циклов оболочки и вместо этого просто используйте этот 1 вызов awk:
awk '
BEGIN { FS=OFS="\t" }
NR==FNR { genes[$1]; next }
FNR==1 { fn=FILENAME; sub(/_.*/,"",fn) }
$4 in genes { out=$4"_out.txt"; print fn, $0 >> out; close(out) }
' listA.txt *hist.txt
Это похоже на простой журнал -веб-сервера. Ответ так же прост, как grep
и awk
.
Пусть файл журнала -имеет имя httpd.log
. Вы можете попробовать эту составную команду:
grep -o 'GET \/product\/[^/]*\/' httpd.log |awk 'BEGIN{FS="\/"}{AA[$3]++}END{for(i in AA){print AA[i]" "i}}'|sort -n -r|awk '{print $2","$1}' |head -n20
Первая часть изолирует важный текст, если он присутствует, вторая часть подсчитывает каждое вхождение номера продукта и печатает результаты, третья сортирует список, а две последние печатают его в указанной вами форме.
Если вы хотите разделить его для каждого дня, вы можете указать перед командой еще один grep
, чтобы указать дату.
Чтобы отфильтровать IP-клиентов, вы можете попробовать самостоятельно, следуя приведенному выше примеру.
awk -v pat="GET /product/[0-9]*" -F'[[:blank:]:[]' '
BEGIN {PROCINFO["sorted_in"]="@val_num_desc"}
$0 ~ pat {match($0, pat)
A[substr($0, RSTART+13, RLENGTH-13)]++}
!C[$5,$1]++ {D[$5]++}
END {for(i in A){if(++j > 20) break; print i "," A[i]}
for(i in D) print i "," D[i]}
' file
BEGIN {PROCINFO["sorted_in"]="@val_num_desc"}
-Через элемент массива задайте сортировку по убыванию значения. $0 ~ pat {match($0, pat);A[substr($0, RSTART+13, RLENGTH-13)]++}
-Создание массива с ключами, соответствующими номеру продукта, количество считается в значении. !C[$5,$1]++ {D[$5]++}
-Подсчет уникальных значений. Ключи проверки состоят из даты и IP. END {for(i in A){ if(++j > 20) break; print i "," A[i]}
-Печать первых 20 ключей и значений массива по точке A ). for(i in D) print i "," D[i]}
-Распечатка значений и ключей, отсортированных по значению.
Если вам нужно отсортировать по дате для последней точки, вы можете перенаправить вывод в команду оболочки. Изменить последнюю строку:
for(i in D) print i "," D[i] | "sort -rt\"/\" -k3,3 -k2,2 -k1,1"}