2015-12-12 4 views
1

Моя цель, чтобы подсчитать количество слов в файлеПодсчет количества слов во всех строках в сценарии оболочки

Мой входной файл ниже:

100,Surender,CTS 
101,Kumar,TCS 
102,Raja,CTS 
103,Vijay,TCS 

Ожидаемый ответ 12

скрипт оболочки, который я написал для этого ниже

let total_no_of_words=0; 
while read each_line ; 

do 

    words=`echo $each_line | tr "," " " |wc -w` 
    total_no_words=`expr $total_no_words + $words` 

done < /home/user/surender/linux/inputfiles/records.txt; 

echo $total_no_of_words 

Но, как указано выше сценарий вывод, что я get равен 0. , если я сохраняю переменную $ total_no_words внутри цикла while, она дает кумулятивное количество слов, например 3 6 9 12

Что мне нужно сделать, чтобы получить результат 12?

ответ

1

Это простая опечатка

total_no_of_words=`expr $total_no_of_words + $words` 
+0

о, да .. моя ошибка. –

0

Вы можете использовать AWK:

awk -F, '{n+=NF}END{print n}' file 

Я использую , в качестве разделителя полей (слова Разделителя в вашем контексте) и добавить количество слов для каждой строки переменной n. После обработки всех строк я печатаю значение n.


Я хотел бы использовать AWK здесь, но только из любопытства, если вы хотите использовать wc для подсчета слов, я хотел бы использовать grep поставить каждое слово на одной строке и считать строки:

grep -o '[^,]\+' file | wc -l 

Также вы спросили, как это сделать, используя цикл while. Вы можете сделать это следующим образом:

while read word ; do 
    n=$((n+1)) 
done < <(grep -o '[^,]\+' file) 
echo "$n" 

Но так или иначе, используйте awk! :)

+0

ok. Можно ли добиться того же подсчета слов с помощью цикла while. Я только начинаю учиться в Linux, поэтому спросил –

0

Вы можете использовать sed

cat your_file.txt | sed 's/[[:punct:]]\+/\n/g' |wc -l 
12 

your_file.txt

100,Surender,CTS 
101,Kumar,TCS 
102,Raja,CTS 
103,Vijay,TCS 
+0

Спасибо за ваш ответ –

+0

Добро пожаловать @SurenderRaja –

0

Другой способ упростить Ваш скрипт, чтобы прочитать каждую строку в массив и просто суммировать результирующие массивы.

total_no_of_words=0 
while read -a each_line; do 
    ((total_no_of_words += ${#each_line[@]})) 
done < /home/user/surender/linux/inputfiles/records.txt; 

echo $total_no_of_words 
Смежные вопросы