количество извлеченного текста для каждого номера

#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, и ее легко запомнить.