我知道当文本文件包含以下内容时如何迭代文本行:
abc
pqr
xyz
但是,如果我的文本文件的内容如下,
abc xyz
cdf pqr
lmn rst
我需要将值“abc”存储到一个变量中,将“xyz”存储到另一个变量中。我该怎么做?
答案 0 :(得分:1)
read
将行传递给$IFS
的次数与将变量传递给它的次数相同:
while read var1 var2 ; do
echo "var1: ${var1} var2: ${var2}"
done
您会看到,如果传递var1和var2,则两列都会转到单独的变量。但请注意,如果该行包含更多列,则var2将包含整个剩余行,而不仅仅是column2。
输入help read
了解详情。
答案 1 :(得分:1)
如果分隔符是空格,则可以执行以下操作:
#!/bin/bash
ALLVALUES=()
while read line
do
ALLVALUES+=( $line )
done < "/path/to/your/file"
之后,您可以通过${ALLVALUES[0]}
或${ALLVALUES[1]}
等
答案 2 :(得分:1)
如果你想将文件中的每个单词都读成一个数组,你可以这样做:
arr=()
while read -r -a _a; do
arr+=("${a[@]}")
done < infile
使用-r
来避免read
解释输入中的反斜杠,使用-a
将单词(在$IFS
上拆分)拆分为数组。然后它将该数组的所有元素附加到累积数组,同时对于globbing和其他元字符是安全的。
答案 3 :(得分:0)
这个awk命令逐字读取输入:
awk -v RS='[[:space:]]+' '1' file
abc
xyz
cdf
pqr
lmn
rst
要填充shell数组,请在进程替换中使用awk命令:
arr=()
while read -r w; do
arr+=("$w")
done < <(awk -v RS='[[:space:]]+' '1' file)
打印数组内容:
declare -p arr
declare -a arr='([0]="abc" [1]="xyz" [2]="cdf" [3]="pqr" [4]="lmn" [5]="rst")'