繁体   English   中英

解析具有空元素的数组

[英]Parsing an array with emty element

您好,我正在尝试将文件解析为包含空元素的数组

示例文件( test

test11|test12|test13|test14
test21||test23|test24

下面的函数只是打印数组元素

test_func()
{
    local param=($@)
    echo "1: ${param[1]}, 2: ${param[2]}, 3: ${param[3]}, 4: ${param[4]}"
}

现在我称这个 function 如下

while IFS=\| read f1 f2 f3 f4
do
    arr=("$f1" "$f2" "$f3" "$f4")
    test_func ${arr[@]}
done < test

我正在使用zsh 5.8.1 (x86_64-ubuntu-linux-gnu) 我得到以下 output

1: test11, 2: test12, 3: test13, 4: test14
1: test21, 2: test23, 3: test24, 4: 

请注意,在第二行中,元素向左移动。

我不确定我在这里做错了什么。 有人可以帮我吗?

谢谢

您需要引用${arr[@]}$@以保留每个产生的空字符串。

未加引号的参数扩展不受分词影响,但数组扩展产生的单独元素不受分词影响。 它们本身就是独立的单词,因此不引用上述扩展中的任何一个都会产生未引用的单词 一个不带引号的空字符串只是“消失”。 如果$arr[@]不加引号,空字符串永远不会进入test_func ,如果$@不加引号,则空字符串不会出现在对param的赋值中。

test_func()
{
    local param=("$@")
    echo "1: ${param[1]}, 2: ${param[2]}, 3: ${param[3]}, 4: ${param[4]}"
}

while IFS=\| read f1 f2 f3 f4
do
    arr=("$f1" "$f2" "$f3" "$f4")
    test_func "${arr[@]}"
done < test

使用awk命令要容易得多:

awk -F'\\|' -v OFS=', ' '{ for(i=1;i<=NF;i++) $i=i": "$i }1' test.txt

1: test11, 2: test12, 3: test13, 4: test14
1: test21, 2: , 3: test23, 4: test24

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM