#regex #awk #sed #grep
#регулярное выражение #awk #sed #grep
Вопрос:
У меня есть текстовый файл с множеством SQL-запросов, которые выглядят примерно так…
select * from sometable where customernos like 'g890%';
select name, city from sometable where customernos like 'g890%';
select * from othertable where customernos like '345%';
Я могу получить количество, используя такую команду…
grep -v 67890 file.txt | wc -l
Но есть ли какой-нибудь способ, которым я могу получить количество всех номеров клиентов, например, отчет…
12345 1
67890 2
Комментарии:
1. Вы пробовали
grep -c '[0-9]{5}' file
? Или что-то вродеgrep -o '[0-9]{5}' file | wc -l
?'b[0-9]{5}b'
?2. @RavinderSingh13
grep -o '[0-9]{5}' file
извлечет все совпадения, а не строки. И я забыл добавить-E
выше. Должно бытьgrep -oE 'b[0-9]{5}b'
3. Вы можете использовать
grep -oE 'b[0-9]{5}b' file | sort | uniq -c
для печати количества 5-значных вхождений чисел с найденными значениями справа. ДЕМОНСТРАЦИЯ .
Ответ №1:
Не могли бы вы попробовать следующее.
awk '
match($0,/%[^%][0-9]{5}/){
val[substr($0,RSTART 1,RLENGTH-1)]
}
END{
for(i in val){
print i,val[i]
}
}' Input_file
Для показанных примеров вывод будет следующим.
12345 1
67890 2
Объяснение: добавление объяснения выше.
awk ' ##Starting awk program from here.
match($0,/%[^%][0-9]{5}/){ ##Using match function to match from % to till 5 digits before next occurrence of % here.
val[substr($0,RSTART 1,RLENGTH-1)] ##Creating val with index of sub-string of matched regex above.
}
END{ ##Starting END block of this program from here.
for(i in val){ ##Traversing through val here.
print i,val[i] ##Printing value of i and value of array val with index i here.
}
}' Input_file ##Mentioning Input_file name here.
Комментарии:
1. Спасибо. Это правильно. но я хотел бы выбрать только 5-значные числа. Это также возвращает 10 или 12 цифр. Возможно ли это?
2. @shantanuo, уверен, что теперь изменил регулярное выражение, чтобы поймать 5 цифр, пожалуйста, проверьте его сейчас один раз и сообщите в случае запросов.
Ответ №2:
Это может сработать для вас (GNU grep, sort, uniq и awk):
grep -Eo 'b[0-9]{5}b' file | sort -n | uniq -c | awk '{print $2,$1}'
Найдите 5-значные числа, отсортируйте их, отфильтруйте и посчитайте, а затем переверните столбцы.
Просто для удовольствия, вот решение sed:
sed -nE 'H;$!d;x;s/[^0-9]/ /g;s/ / /g;
:a;x;s/.*/1/;x;tb;
:b;s/^(( S b).*)2b/1/;Tc;x;s/.*/expr amp; 1/e;x;tb;
:c;G;s/^ (S )(.*)n(.*)/1 3n2/;/^[0-9]{5} /P;s/.*n//;/S/ba' file
Вставьте файл в память.
Разделяйте числа пробелами.
Уменьшите количество вхождений первого числа до одного и подсчитайте вхождения.
Выведите первое число и его вхождения, если оно соответствует критериям.
Повторите со всеми остальными числами.
Комментарии:
1. Я принял этот ответ, потому что команда grep более удобочитаема, чем awk, и ее легко запомнить.