简体   繁体   中英

Parsing an array with emty element

Hello I am trying to parse a file into an array which contains empty elements

Sample file ( test )

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

the following funtion just print the array elements

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

And now I call this function as follows

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

I am using zsh 5.8.1 (x86_64-ubuntu-linux-gnu) . I got the following output

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

Note that in the second line the elements are shifted to the left.

I am not sure what I am doing wrong here. Can someone please help me on this?

Thanks

You need to quote both ${arr[@]} and $@ in order to preserve the empty sting produced by each.

Unquoted parameter expansions are not subject to word-splitting , but the separate elements produced by an array expansion are not due to word-splitting. They are individual words in their own right, so failing to quote either the expansions mentioned above produces unquoted words . An unquoted empty string simply "goes away". If you leave $arr[@] unquoted, the empty string never makes it into test_func , and if leave $@ unquoted, the empty string is not present in the assignment to 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

It's much easier with awk command:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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