0

在将其放入 shell 脚本之前,我正在检查 shell 上的 shell 行

$ cat file.csv | awk -F',' '{ print $2 }' 
"test1 test2 test1"
"test2 test3 test100"
"test3 test4 test3"

而在脚本中,我将上述所有信息填充到这样的数组中

arr=(`cat file.csv | awk -F',' '{ print $2 }'`)
for v in ${arr[@]}
do
    echo $v
done

它像这样呼应我

"test1
test2
test1"
"test2 
test3 
test100"
"test3 
test4 
test3"

我希望数组填充,例如,像这样的条目:

"test1 test2 test1"

并不是

"test1
test2
test1"
4

2 回答 2

3

这里的问题是 bash 确定分隔数组每个元素的方式。默认情况下,它使用 IFS 变量中的任何字符,默认为空格,即制表符空格和换行符。由于数组的每个元素都包含空格,因此如果您希望它正常工作,它不能成为 IFS 的一部分。因此,如果您尝试:

root@host$ cat x.txt
blah,one two three,blah
blah,four five six, blah
root@server$ IFS=$'\n' arr=( $(  awk -F',' '{print $2 }' x.txt ) ) ## no need to cat into awk it can take a filename argument to read from
root@server$ for v in ${arr[@]};do echo "$v";done
one two three
four five six

你应该看到它正确输出

于 2013-01-29T10:27:14.220 回答
0

问题是如何填充数组,原始问题使用 csv 中的引用值,分配给数组时会忽略这些值。

请注意,在 arr 的赋值中,$( ) 位用双引号引起来。

file.csv="test1 test2 test1","test2 test3 test100","test3 test4 test3"

$ arr=( "$( awk -F, 'print $2}' file.csv)" )

将正确地将值放入数组中,

$ for f in ${arr[@]}; do echo $f; done

将打印出第二个值:

"test2 test3 test100"

第二个值的引号仍然存在,无论您使用 echo $f 还是 echo "$f",都无所谓。

于 2013-01-29T11:16:46.300 回答