Как перебирать слова моего текстового документа в оболочке. Я хочу отобразить количество слов в моем текстовом документе - PullRequest
0 голосов
/ 10 сентября 2018

Я попробовал это, но вместо этого отображается количество строк.

declare -i x=0 while IFS="" read -r p || [ -n "$p" ] do x=x+1 done <test.txt echo "$x

Я был бы благодарен, если бы кто-то мог объяснить это, так как я новичок

Ответы [ 3 ]

0 голосов
/ 10 сентября 2018

Я бы использовал для этого awk:

$ echo "Lorem ipsum dolor sit amet,
        consectetur adipisci elit,
        ..." | 
awk '{
    for(i=1;i<=NF;i++)
        print "iterating " $i
}'

Выход:

iterating Lorem
iterating ipsum
iterating dolor
iterating sit
iterating amet,
iterating consectetur
iterating adipisci
iterating elit,
iterating ...
0 голосов
/ 10 сентября 2018
grep -oE '\w+' YOUR_FILE.txt

записывает слова из YOUR_FILE.txt в стандартный вывод. Передайте это в ваш цикл, и у вас будет итерация над словами.

Предполагается, что «слово» в вашем случае - это один или несколько символов, описываемых \w, то есть либо подчеркивание, либо то, что в вашей текущей локали определяется как буквенно-цифровой символ. Если ваше представление о «слове» отличается, вы, конечно, можете адаптировать регулярное выражение в соответствии с вашими потребностями.

0 голосов
/ 10 сентября 2018

Если ваши слова разделены табуляцией, пробелами и новыми строками, будет показан следующий фрагмент:

echo $'word1 word2! word3
\tword4\t\t\t\t\t\tword5\tword6
word7 word8


word9 word10' | \
while IFS=$'\t ' read -ra linewords; do
    for i in "${linewords[@]}"; do
            echo word is "'$i'"
    done
done

:

word is 'word1'
word is 'word2!'
word is 'word3'
word is 'word4'
word is 'word5'
word is 'word6'
word is 'word7'
word is 'word8'
word is 'word9'
word is 'word10'

Используется несколько значений IFS в сочетании с readчитая массив, см. этот ответ о том, как разбить строку на делитере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...