2015-04-07 3 views
0

Я пытаюсь читать и отображать каждое слово в текстовом файле, а затем выделять указанный гласный или согласный.Как сопоставить строковые значения из текстового файла в скрипте bash

Когда я читаю из файла, я могу читать только целую строку, поэтому я использовал цикл для чтения каждого слова в строке. Однако, когда я это делаю, я не могу получить доступ к различным позициям в этом слове. (Например, если слово «счастливый» Я не могу получить доступ к 2-ой positon для буквы «а»)

#READS EACH LINE 
while read line 
    do 
      #READS EACH WORD IN THE LINE 
      for word in $line 
      do 
        #LOOPS THROUGH EACH CHARACTER IN THE WORD 
        for ((i=0; i<${#word}; i++)) 
        do 
          #LOOPS THROUGH ALL VALUES IN VOWEL ARRAY 
          for ((j=0; j<10; j++)) 
          do 
            #MATCHES IF A VOWEL IS FOUND 
            if [ "${word[$i]}" == "${varray[$j]}" ] 
            then 
              let vcount++ 
              echo i:$i j:$j 
              echo word: ${word[$i]} varray: ${varray[$j]} #DEBUG 

            fi 
          done 
        done 
              #MORE CODE HERE DOING STUFF PRINTING TO SCREEN 
      done 
    done < $file 

Есть ли что-то я делаю не так? или мне нужно читать файл по-другому, чтобы получить доступ к каждому символу слова?

Когда я echo слово в двойном for loop, оно отображает целое слово в качестве первой позиции вместо первого символа. Остальные позиции 2, 3 и т. Д. Пустые.

ответ

0

Вы, кажется, путаете индексирование массива с помощью подстроки строки («substringing», если хотите). Это совершенно разные операции на каждом языке программирования, с которым я знаком. В bash индексирование массива выполняется с помощью переменной замены ${arr[index]}. Вам нужна форма переменной замены ${str:index:length}, которая выполняет подстановку. Вот как это можно использовать, чтобы сделать вашу работу сценария:

#!/bin/bash 

file='file'; 
varray='aeiouy'; 

#READS EACH LINE 
while read line; do 
    #READS EACH WORD IN THE LINE 
    for word in $line; do 
     #LOOPS THROUGH EACH CHARACTER IN THE WORD 
     for ((i=0; i<${#word}; i++)); do 
      #LOOPS THROUGH ALL VALUES IN VOWEL ARRAY 
      for ((j=0; j<${#varray}; j++)); do 
       #MATCHES IF A VOWEL IS FOUND 
       wordChar="${word:$i:1}"; 
       vChar="${varray:$j:1}"; 
       if [[ "$wordChar" == "$vChar" ]]; then 
        let vcount++; 
        echo "i:$i j:$j"; 
        echo "wordChar: $wordChar vChar: $vChar"; 
       fi; 
      done; 
     done; 
    done; 
    #MORE CODE HERE DOING STUFF PRINTING TO SCREEN 
done <$file; 

exit 0; 

Демо:

cat file; 
## abc def ghi 
## jkl mno pqr 

./script; 
## i:0 j:0 
## wordChar: a vChar: a 
## i:1 j:1 
## wordChar: e vChar: e 
## i:2 j:2 
## wordChar: i vChar: i 
## i:2 j:3 
## wordChar: o vChar: o 

Другие ноты:

  • Ваш код для чтения из файла и разбить его на слова просто отлично. Единственное предостережение в том, что команда read line потеряет ведущие и конечные пробелы. Это не важно для вашего скрипта, но если вы решили это решить, вы можете просто позвонить по номеру read, а вся строка (включая начальное и конечное пробелы) будет считана по умолчанию в переменной $REPLY.
  • В вашем коде вы повторили j от 0 до 9, но максимальный размер зависит от длины varray (что на самом деле является строкой, вероятно, следует переименовать ее), поэтому вы должны использовать ${#varray} как максимум.
  • Используйте [[ ... ]] для оценки выражения вместо старой формы [ ... ]; более новая форма немного более мощная.
+0

Благодарю вас за ответ, он уточнил для меня немного больше. Мне удалось заставить мой скрипт соответствовать гласным: D. Теперь, когда я добавляю IF-инструкции с разными условиями в зависимости от количества гласных, он всегда входит в один и тот же оператор IF независимо от того, есть ли 1, 2 или нет гласных? – hotlinks0

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