在bash中将带有空格的输入作为数组中的单个元素

时间:2015-06-16 18:55:20

标签: arrays bash unix

我有一个文件,我使用cut命令从中提取前三列,然后将它们写入数组。

当我检查阵列的长度时,它给了我四个。我需要数组只有3个元素。

我认为它将空间作为数组元素的分隔符。

aaa|111|ADAM|1222|aauu

aaa|222|MIKE ALLEN|5678|gggg
aaa|333|JOE|1222|eeeee

target=($(cut -d '|' -f1-3 sample_file2.txt| sort -u ))

3 个答案:

答案 0 :(得分:2)

bash 4或更高版本中,使用带有进程替换的readarray来填充数组。因此,您的代码无法区分输出中每行与“Mike Allen”中出现的空白分隔的空格。 readarray命令将输入​​的每一行放入一个单独的数组元素中。

readarray -t target < <(cut -d '|' -f1-3 sample_file2.txt| sort -u)

bash 4之前,您需要一个循环来分别读取每一行以分配给数组。

while IFS='' read -r line; do
    target+=("$line")
done < <(cut -d '|' -f1-3 sample_file2.txt | sort -u)

答案 1 :(得分:1)

这应该有效:

IFS=$'\n' target=($(cut -d '|' -f1-3 sample_file2.txt| sort -u ))

示例:

#!/bin/bash
IFS=$'\n' target=($(cut -d '|' -f1-3 sample_file2.txt| sort -u ))
echo ${#target[@]}
echo "${target[1]}"

输出:

3
aaa|222|MIKE ALLEN

答案 2 :(得分:0)

作为替代方案,使用臭名昭着的eval

eval target=($(cut -sd '|' -f1-3 sample_file2.txt | sort -u | \
               xargs  -d\\n printf "'%s'\n"))