awk 将是我最好的选择。
declare NAMES=( $( cmd_that_generates_output | awk -F ';' 'NR==1{next}; { if( $3 ~ /^[^"].*[^"]$/){$3="\""$3"\""}; printf $3 " " }' ) )
因此,bash 执行命令替换,即 $() 中的所有内容,cmd 生成您的 csv 并将其通过管道传递给 awk。
awk 检查输入是否是第一行( NR==1 ),如果是则继续( {next} )
对于其他每一行,它会检查它是否正确地包含在引号中
if( $3 ~ /^[^"].*[^"]$/){$3="\""$3"\""};
然后打印出由 ';' 分隔的第三列 (即 naem 列)后跟一个空格。
printf $3 " "
然后将 $() 扩展为以空格分隔的名称列表,例如
declare NAMES=( name1 name2 )
然后执行声明,它创建一个名为 NAMES 的数组,每个名称作为单个元素。所以:
x.txt 是您在问题中给出的输出。
pete.mccabe@jackfrog$ cat x.txt
"STACK";"STACK_ID";"NAME";"DESCRIPTION";"CREATION_TIME";"DELETION_TIME";"STATUS"
"STACK";"arn:aws:cloudformation:us-west-1:222222222222:stack/LiveStream2/00000000-6000-00e2-acd3-333333333333";"LiveStream2";"(nil)";"2013-01-23T16:01:36Z";"2013-01-23T16:22:57Z";"DELETE_COMPLETE"
"STACK";"arn:aws:cloudformation:us-west-1:444444444444:stack/LiveStream/00000000-6000-00e2-acd3-222222222222";Live Stream;"(nil)";"2013-01-23T13:53:13Z";"2013-01-23T15:20:29Z";"DELETE_COMPLETE"
pete.mccabe@jackfrog$ declare NAMES=( $( cat x.txt | awk -F ';' 'NR==1{next}; { if( $3 ~ /^[^"].*[^"]$/){$3="\""$3"\""}; printf $3 " " }' ) )
pete.mccabe@jackfrog$ echo ${NAMES[@]}
"LiveStream2" "Live Stream"