1

通过对命令行的请求,我得到了 csv 格式的响应。这是文件:

"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";"LiveStream";"(nil)";"2013-01-23T13:53:13Z";"2013-01-23T15:20:29Z";"DELETE_COMPLETE"

使用脚本,我想获取 NAME 字段的值并将其放入变量中,你能帮帮我吗?

4

4 回答 4

2

如果您不知道 NAME 是第三个字段,则必须在标题行中寻找它:

awk -F \; '
    NR==1 {
        for (i=1; i<=NF; i++) {
            if ($i == "\"NAME\"") {
                name_field = i
                break
            }
        }
        next
    }
    { print $name_field }
' < filename

这输出

"LiveStream2"
"LiveStream"
于 2013-01-24T22:14:48.520 回答
1

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"
于 2013-01-24T14:26:13.230 回答
1

这是示例代码。

#!/bin/sh
OLDIFS=$IFS
IFS=;
while read f1 f2 f3 
do
     echo "Name variable is              :$f3"

done<filename.csv
IFS=$OLDIFS

第三个字段是“NAME”,它在 f3 的变量中赋值。这里变量显示了两次。

于 2013-01-24T12:58:15.103 回答
1

那么 cut 命令应该很适合您:例如,如果您的文件是test.txt,

cat test.txt| cut -d';' -f3将获得字段 3。

如果要逐行存储值,请使用以下命令:

for i in `cat test.txt`
do
  MYVAR=$(echo $i| cut -d';' -f3)
  //do something with the variable $MYVAR
done

注意:这只是解决您问题的一种方法。有几种方法可以实现您的要求。

于 2013-01-24T12:59:22.220 回答