我已阅读this question有关如何使用bash从文本文件中读取n个字符的信息。我想知道如何从一个看起来像这样的文件中一次读一个单词:
example text
example1 text1
example2 text2
example3 text3
任何人都可以向我解释一下,或者给我一个简单的例子吗? 谢谢!
答案 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)
您可以将读取由空格或换行符分隔的单词的xargs
和echo
组合起来,每行打印一个:
<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