如何从文件中读取单词(而不是行)?

时间:2012-06-07 12:36:19

标签: bash

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

example text
example1 text1
example2 text2
example3 text3

任何人都可以向我解释一下,或者给我一个简单的例子吗? 谢谢!

8 个答案:

答案 0 :(得分:17)

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

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

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

对于面向文件的操作,当前版本的Bash也支持mapfile built-in。例如:

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

无论哪种方式,阵列都是可行的方法。值得花些时间熟悉Bash array syntax以充分利用此功能。

答案 1 :(得分:12)

默认情况下,read命令会读取整行。因此,解决方案可能是读取整行,然后将其拆分为空格,例如: for

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

答案 2 :(得分:7)

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

这是一种无需嵌套循环的技术:

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

答案 3 :(得分:4)

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

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

答案 4 :(得分:1)

这也可以使用AWK完成:

awk'{for(i = 1; i <= NF; i ++){print $ i}}'文本文件

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

在bash中,只需使用space作为分隔符(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循环,但不使用通配符扩展。

答案 7 :(得分:0)

您可以将读取由空格换行符分隔的单词的xargsecho组合起来,每行打印一个:

<some-file xargs -n1 echo

some-command | xargs -n1 echo

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

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

sqlite3 db.sqlite .tables | xargs -n1 echo | while read table; do echo "1 table: $table"; done
相关问题