避免在 bash 数组中存储的输出中按空格分割字符串

问题描述 投票:0回答:1

数组

A
存储此 awk 脚本的输出:

A=(`awk 'BEGIN{
        z[1]=4;z[2]=7;z[3]=5;
        w[1]="how are you?"; w[2]="fine and you?"; w[3]="fine, thank you"; 
        
        for (i = 1; i <=3; i++ ) {
            printf("%s|%s\n",w[i],z[i])
        }
    }'`)   

数组

A
应该存储这 3 行:

A[1] = "how are you?|4"
A[2] = "fine and you?|7"
A[3] = "fine, thank you|5"

但是当我尝试分割

A
内每一行的内容时,即使我设置了
IFS ='|'
,也会将空格作为字段分隔符,因为 当我发送这个 for 循环脚本时

n=${#A[*]}

for ((i=0; i<=n; i++)); do
    IFS='|' read -ra B <<< "${A[$i]}"
    
    echo "String: " ${B[0]} ", value: " ${B[1]}
done

我得到这个输出:

String:  how , value:
String:  are , value:
String:  you? , value:  4
String:  fine , value:
String:  and , value:
String:  you? , value:  7
String:  fine, , value:
String:  thank , value:
String:  you , value:  5
String:  , value:

我的预期输出是这样的:

STRING: how are you?, VALUE: 4
STRING: fine and you?, VALUE: 7
STRING: fine, thank you, VALUE: 5

如何解决这个问题?我想保留这个脚本的结构,因为它是另一个具有类似输出的更大 awk 脚本的一部分。预先感谢。

bash awk
1个回答
0
投票

OP 的当前代码将每个空格分隔的单词存储为数组中的单独条目。我们通过以下内容看到这一点:

$ typeset -p A
declare -a A=([0]="how" [1]="are" [2]="you?|4" [3]="fine" [4]="and" [5]="you?|7" [6]="fine," [7]="thank" [8]="you|5")

awk 输出的每个

line
存储为单独的数组条目的一些想法:

# let bash map each line as a separate array entry

mapfile   -t A < <( awk '...' )
readarray -t A < <( awk '...' )       # readarray is a synonym for mapfile

# use a while/read loop to process each line separately

A=()                                  # init array

while read -r line
do
    A+=( "${line}" )                  # add ${line} as a new array entry
done < <( awk '...' )

所有这些都会产生:

$ typeset -p A
declare -a A=([0]="how are you?|4" [1]="fine and you?|7" [2]="fine, thank you|5") 
© www.soinside.com 2019 - 2024. All rights reserved.