2013-11-10 4 views
1

У меня есть данные в следующем виде:Подсчет числа строк, содержащих шаблон

<id_mytextadded1829> 
<text1> <text2> <text3>. 
<id_m_abcdef829> 
<text4> <text5> <text6>. 
<id_mytextadded1829> 
<text7> <text2> <text8>. 
<id_mytextadded1829> 
<text2> <text1> <text9>. 
<id_m_abcdef829> 
<text11> <text12> <text2>. 

Теперь я хочу, чтобы количество строк, в которых <text2> присутствует. Я знаю, что могу сделать то же самое с использованием регулярного выражения python. Но регулярное выражение скажет мне, есть ли шаблон в строке или нет? С другой стороны, мое требование - найти строку, которая присутствует точно в середине строки. Я знаю, что sed подходит для замены содержимого, присутствующего в строке. Но вместо замены, если мне нужно только количество строк ... это можно сделать с помощью sed.

EDIT: Извините, что забыл упомянуть. Я хочу строки, где <text2> происходит в середине строки. Мне не нужны строки, где <text2> происходит в начале или в конце строки. . в данных, показанных выше, число линий, которые имеют <text2> в середине, равны 2 (а не 4).

Есть ли какой-нибудь способ, с помощью которого я могу достичь желаемого подсчета числа строк, с помощью которого я могу узнать количество строк, которые имеют <text2> в середине, используя Linux или питон

ответ

2

Мне нужны линии, в которых <text2> встречается в середине линии.

Вы могли бы сказать:

grep -P '.+<text2>.+' filename 

в список строк, содержащих <text2> не в начале или в конце строки.

Для того, чтобы получить только количество матчей, вы могли бы сказать:

grep -cP '.+<text2>.+' filename 
+1

Я не думаю, что '-P' действительно необходим в этом случае. ('-E' будет работать просто отлично, так как это ускользает от' + 'как' \ + '. Моя страница man для grep предполагает, что опция очень экспериментальная) – Hasturkun

+0

@Hasturkun Typing _-P_ требует меньше усилий по сравнению с экранированием , PCRE, т.е. YMMV. – devnull

1

Вы можете использовать grep для этого , Например, это будет подсчитывать количество строк в файле, которые соответствуют шаблону: ^123[a-z]+$

egrep -c ^123[a-z]+$ file.txt 

P.S. Я не совсем уверен в синтаксисе, и у меня нет возможности проверить его на данный момент. Возможно, регулярное выражение должно быть указано.

Edit: вопрос немного сложнее, так как мы не знаем точно, что ваши данные является и что именно вы пытаетесь считать в нем, но все это сводится к тому, правильно сформулировать регулярный выражение.

Если мы предположим, что <text2> - это точная последовательность символов, которая должна присутствовать в середине строки и не должна присутствовать в начале и в конце, тогда это должно быть регулярное выражение, которое вы ищете: ^<text[^2]>.*text2.*<text[^2]>\.$

+0

К сожалению, я забыл упомянуть. Мне нужны строки, где встречается в середине строки. Мне не нужны строки, где встречается в начале или в конце строки. . в приведенных выше данных количество строк, которые имеют в середине, равны 2 (а не 4). –

+0

+1 вам .. спасибо за помощь .. но мое требование на самом деле немного другое..и добавили его сейчас .. очень сожалею об этом –

+0

Ваши правые _prompts_ мне комментировать, что, пожалуйста, не придирайтесь '^ . * text2. * \. $ '- это не соответствует строкам типа' ', который, по-видимому, подходит OP. – devnull

0

Я хочу строк, в которых происходит в середине строки. Я не хочу хочу, чтобы линии были в начале или в конце линии .

Попробуйте использовать grep с -c

grep -c '>.*<text2>.*<' file 

Выход:

2 
0

Использование awk вы можете сделать это:

awk '$2~/text2/ {a++} END {print a}' file 
2 

Он будет считать все строки с text2 в середине линии.

0

Где происходят (везде)

sed -n "/<text2>/ =" filename 

, если вы хотите в середине (как напишу позже в комментариях)

sed -n "/[^ ] \{1,\}<text2> \{1,\}[^ ]/ =" filename 
Смежные вопросы