获取NAME字段的值并将其放入变量中,

时间:2013-01-24 12:38:15

标签: linux bash csv

通过对命令行发出的请求,我得到了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 个答案:

答案 0 :(得分:2)

如果您不知道NAME是第3个字段,则必须在标题行中搜索它:

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

此输出

"LiveStream2"
"LiveStream"

答案 1 :(得分:1)

这是示例代码。

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

done<filename.csv
IFS=$OLDIFS

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

答案 2 :(得分:1)

切割命令应该适合你: 例如,如果您的文件是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

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

答案 3 :(得分:1)

Awk将是我最好的选择。

declare NAMES=( $( cmd_that_generates_output | awk -F ';' 'NR==1{next}; { if( $3 ~ /^[^"].*[^"]$/){$3="\""$3"\""};  printf $3 " " }' ) )

所以bash执行comand subsititution,即$()cmd内的所有内容都会生成你的csv并将其传递给awk。

Awk检查输入是否是第一行(NR == 1),如果是({next})则继续

对于其他所有行,它会检查它是否正确包含在引号

if( $3 ~ /^[^"].*[^"]$/){$3="\""$3"\""};

然后打印出由';'分隔的第3列(即naem列)后跟一个空格。

printf $3 " " 

然后将$()扩展为空格分隔的名称列表,例如

declare NAMES=( name1 name2 )

然后执行declare,创建一个名为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"