如何使用shell脚本迭代具有多行每行的文本文件?

时间:2016-04-20 14:56:01

标签: bash shell unix scripting sh

我知道当文本文件包含以下内容时如何迭代文本行:

abc  
pqr  
xyz

但是,如果我的文本文件的内容如下,

abc xyz  
cdf pqr  
lmn rst

我需要将值“abc”存储到一个变量中,将“xyz”存储到另一个变量中。我该怎么做?

4 个答案:

答案 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")'