如何使用 shell 脚本遍历每行包含多个单词的文本文件?

How to iterate over text file having multiple-words-per-line using shell script?

我知道当文本文件包含如下内容时如何遍历文本行:

abc  
pqr  
xyz

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

abc xyz  
cdf pqr  
lmn rst

并且我需要将值 "abc" 存储到一个变量并将 "xyz" 存储到另一个变量。我该怎么做?

read 将行拆分 $IFS 次,次数与传递变量给它的次数相同:

while read var1 var2 ; do
    echo "var1: ${var1} var2: ${var2}"
done

你看,如果你传递 var1 和 var2,两列都会转到单独的变量。但请注意,如果该行包含更多列,则 var2 将包含整个剩余行,而不仅仅是 column2.

键入 help read 了解更多信息。

如果分隔符是 space 那么你可以这样做:

#!/bin/bash

ALLVALUES=()
while read line
do
    ALLVALUES+=( $line )
done < "/path/to/your/file"

所以之后,您可以通过 ${ALLVALUES[0]}${ALLVALUES[1]} 等引用元素

这个 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")'

如果您想将文件中的每个单词读取到一个数组中,您可以这样做:

arr=()
while read -r -a _a; do
   arr+=("${a[@]}")
done < infile

它使用 -r 来避免 read 解释输入中的反斜杠,并使用 -a 将单词(在 $IFS 上拆分)拆分为一个数组。然后它将该数组的所有元素追加到累积数组,同时对于 globbing 和其他元字符是安全的。