2012-05-15 3 views
3

К слово, я имею в виду любую строку с разделителями пробелов.В linux bourne shell: как подсчитать вхождения определенного слова в файл

Предположим, что файл test.txt имеет следующие слова разделенные пробелами:

hello hello hello hell osd 
hello 
hello 
hello 
hellojames beroo helloooohellool axnber hello 
way 
how 

Я хочу, чтобы подсчитать, сколько раз слово привет появляется в каждой строке.

Я использовал команду awk -F "hello" '{print NF-1}' test.txt, чтобы показать число вхождений слова привет в каждой строке:

3 
1 
1 
1 
4 
0 
0 

Так что найти в общей сложности 3 + 1 + 1 + 1 + 4 = 10 вхождений ,

Проблема в четвертой строке: привет происходит только один раз как отдельное слово; такие слова, как hellojames и helloooohellool не должны учитываться, потому что привет не является разделителем пробелом.

Для того, чтобы найти 7 вхождений hello как отдельное слово.

Можете ли вы помочь мне написать команду, которая возвращает правильную сумму в 7 раз?

+0

ли вам нужно число вхождений в каждая строка, или просто общая? –

+0

Мне просто нужно всего – user1304473

ответ

6
awk '{ for(i=1; i<=NF; i++) if($i=="hello") c++ } END{ print c }' file.txt 

Если вам это нужно, чтобы напечатать каждую строку:

awk '{ c=1; for(i=0; i<=NF; i++) if($i=="hello") c++; print c }' 
+0

спасибо, что это работает. – user1304473

+0

На самом деле, третья строка. После этого «привет», за этим приветствием скрыто пустое пространство, , поэтому, когда я посчитал это, привет, [space] nextline, что означает, что это привет [пробел], а не только один «привет» слово это работает, спасибо – user1304473

+0

Извините, по-одному; поля идут 1-NF. Не знаете, почему ваша третья строка выключена, возможно, в ней есть забавный непечатаемый символ. – Kevin

0
for word in `cat test.txt`; do 
    if [[ ${word} == hello ]]; then 
    helloCount=$((${helloCount} + 1)); 
    fi; 
done; 

echo ${helloCount} 
+1

UUoC! http://partmaps.org/era/unix/award.html (Также UUo $ {}, но пока я еще не нашел веб-сайт.) :-) –

+0

Это не сработает. Он хочет подсчет * на строку *. Это реплицирует поведение 'grep -c' (т. Е. Подсчитывает per * файл *). –

+0

@AdamLiss Это не UUoC. Cat необходим для правильной работы цикла for. Он, по сути, хочет прочитать файл в stout, который явно указывает ваша ссылка, является допустимым использованием cat. –

0
a=$(printf "\01") 
b=hello 
sed -e "s/\<$b\>/ $a /g" -e "s/[^$a]//g" -e "s/$a/ $b /g" file | wc -w 
2

Решение:

sed 's/\s\+/\n/g' test.txt | grep -w hello | wc -l 

Объяснение:

sed 's/\s\+/\n/g' text.txt 

Это заменяет каждый пролет пробельных с новой строки, эффективно переформатировать файл test.txt поэтому он имеет одно слово в каждой строке. Команда sed 's/FIND/REPLACE/g' заменяет шаблон FINDREPLACE везде, где он появляется. Образец \s\+ означает «один или несколько пробельных символов», а \n - это символ новой строки.

grep -w hello 

Это извлекает только те строки, которые содержат hello как полное слово.

wc -l 

Подсчитывает количество строк.


Если вы хотите, чтобы подсчитать число вхождений в строке, вы можете использовать ту же технику, но обрабатывать одну строку за один раз:

while read line; do 
    echo $line | sed 's/\s\+/\n/g' | grep -w hello | wc -l 
done < test.txt 
3
grep -o '\<hello\>' filename | wc -l 

В \< и \> биты являются , поэтому выражение не найдет foohello или hellobar.

Вы также можете использовать awk -F '\\<hello\\>' ... для достижения такого же эффекта.

+0

Это работает, спасибо – user1304473

0
cat $FileName | tr '[\040]' '[\012]' | grep $word | wc -l 

Эта команда изменит пространство в новой строке, тогда вы можете сгладить это слово и подсчитать количество строк, содержащих данное слово.

0

изменить только «иглу» и «файл»

#!/usr/bin/env sh 

needle="|" 
file="file_example.txt" 

IFS=$'\n' 

counter=0 
for line in `cat $file` 
do 
    counter=$[$counter+1] 
    echo $counter"|"`echo $line | grep -o "$needle" | wc -l` 
done 

Это будет печатать номер строки и количество вхождений, разделенных вертикальной чертой

 Смежные вопросы

  • Нет связанных вопросов^_^