22

我已经阅读有关如何使用 bash 从文本文件中读取 n 个字符的问题。我想知道如何从一个看起来像这样的文件中一次读取一个单词:

example text
example1 text1
example2 text2
example3 text3

谁能给我解释一下,或者给我一个简单的例子?谢谢!

4

8 回答 8

22

read命令默认读取整行。所以解决方案可能是读取整行,然后将其拆分为空格,例如for

#!/bin/sh

while read line; do
    for word in $line; do
        echo "word = '$word'"
    done
done <"myfile.txt"
于 2012-06-07T12:42:50.860 回答
21

使用标准输入执行此操作的方法是将-a标志传递给读取:

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

这会将您的整行读入索引数组变量,在本例中名为words。然后,您可以使用shell 参数扩展对单词执行任何您喜欢的数组操作。

对于面向文件的操作,当前版本的 Bash 还支持内置的 mapfile . 例如:

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

无论哪种方式,数组都是要走的路。值得您花时间熟悉Bash 数组语法以充分利用此功能。

于 2012-06-07T12:53:10.383 回答
13

通常,您应该使用while read -r line循环从文件中读取。为此并解析行中的单词需要在for循环内嵌套一个while循环。

这是一种无需嵌套循环即可工作的技术:

for word in $(<inputfile)
do
    echo "$word"
done
于 2012-06-07T16:59:34.870 回答
7

在给定的上下文中,单词的数量是已知的:

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
于 2017-08-01T16:26:25.357 回答
2

在 bash 中,只需使用空格作为分隔符 ( read -d ' ')。此方法需要一些预处理以将换行符转换为空格(使用tr)并将多个空格合并为一个空格(使用sed):

{
 tr '\n' ' ' | sed 's/  */ /g' | while read -d ' ' WORD
 do
  echo -n "<${WORD}> "
 done
 echo
} << EOF
Here you have some words, including * wildcards
that don't get expanded,
multiple   spaces   between   words,
    and lines with spaces at the begining.
EOF

此方法的主要优点是您无需担心数组语法,只需使用for循环即可,但无需通配符扩展。

于 2018-05-04T10:34:09.237 回答
1

我遇到了这个问题和建议的答案,但我没有看到列出这个简单的可能解决方案:

for word in `cat inputfile`
do
  echo $word
done
于 2018-03-02T21:48:48.417 回答
1

这也可以使用 AWK 来完成:

awk '{for(i=1;i<=NF;i++) {print $i}}' text_file
于 2018-09-18T14:19:43.610 回答
1

您可以组合xargswhich reads 由空格换行符分隔的单词并echo每行打印一个:

<some-file xargs -n1 echo

some-command | xargs -n1 echo

这也适用于大型或慢速数据流,因为它不需要一次读取整个输入。

我用它一次从 SQLite 读取 1 个表名,它在列布局中打印表名:

sqlite3 db.sqlite .tables | xargs -n1 echo | while read table; do echo "1 table: $table"; done
于 2020-12-22T19:18:25.183 回答