2012-06-07 4 views
7

Я читал this question о том, как читать n символов из текстового файла с помощью bash. Я хотел бы знать, как читать слова в то время, из файла, который выглядит как:Как я могу читать слова (вместо строк) из файла?

example text 
example1 text1 
example2 text2 
example3 text3 

Может кто-нибудь объяснить, что со мной, или показать мне простой пример? Спасибо!

ответ

8

Команда read по умолчанию считывает целые строки. Таким образом, решение, вероятно, должно читать всю строку, а затем разделить ее на пробелы, например. for:

while read line; do 
    for word in $line; do 
     echo "word = '$word'" 
    done 
done 
+0

Где я должен могу название моего файла в приведенном выше коде? – Admia

+0

@Admia Помните, что 'read' читается со стандартного ввода. «Лучшим» способом (IMO) для его решения является включение кода в функцию. И поскольку функции можно вызывать так же, как и любую другую команду, ее также можно использовать с перенаправлением. Итак, вы можете сделать, например. 'function_with_read_loop

+0

Если ваша строка содержит '*' как автономный элемент, вы получите список имен файлов в текущем каталоге из 'for word in $ line'. (Кроме того, 'read' без' -r' будет обрабатывать литералы обратной косой черты). –

14

Способ сделать это с помощью стандартного ввода является пропусканием -a флага следующим образом:

read -a words 
echo "${words[@]}" 

Это будет читать всю строку в индексированный переменный массиве, в данном случае с именем слова. Затем вы можете выполнить любые операции с массивами, которые вам нравятся, на словах с shell parameter expansions.

Для файловых операций текущие версии Bash также поддерживают файл карты built-in. Например:

mapfile < /etc/passwd 
echo ${MAPFILE[0]} 

В любом случае, массивы - это путь. Вам стоит ознакомиться с Bash array syntax, чтобы максимально использовать эту функцию.

6

Обычно вы должны читать из файла, используя цикл while read -r line. Чтобы сделать это и проанализировать слова в строках, необходимо вставить петлю for внутри цикла while.

Вот метод, который работает, не требуя вложенные циклы:

for word in $(<inputfile) 
do 
    echo "$word" 
done 
+0

Я бы не сказал, что строковое расщепление «обычно» правильно. Если у вас есть '*' в вашем файле, вы получите список имен в текущем каталоге на вашем выходе. –

+0

@CharlesDuffy: Эта проблема также влияет на принятый ответ (метод, описанный в моем втором предложении).Метод в моем фрагменте кода не срабатывает аналогичным образом. –

3

В контексте с учетом, где количество слов известно:

while read -r word1 word2 _; do 
    echo "Read a line with word1 of $word1 and word2 of $word2" 
done 

Если вы хотите, чтобы прочитать каждую строку в массив, read -a будет помещать первое слово в элемент 0 вашего массива, второй - в элемент 1 и т. д .:

while read -r -a words; do 
    echo "First word is ${words[0]}; second word is ${words[1]}" 
    declare -p words # print the whole array 
done 
0

я наткнулся на этот вопрос и предлагаемые ответы, но я не вижу в списке это простое решение possibile:

for word in `cat inputfile` 
do 
    echo $word 
done 
+0

Это не указана по уважительной причине: это очень багги. Если у вашего входного файла есть '*', вы получите список файлов в текущем каталоге вашего вывода - и потому, что аргумент 'echo' не цитируется, если одно из ваших имен файлов разбивается на набор слов, содержащий глобус, который также будет расширяться. См. Также [Почему вы не читаете строки с 'for'] (http://mywiki.wooledge.org/DontReadLinesWithFor). –

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