使用AWK从文件中读取多次出现的变量

时间:2016-09-16 14:43:23

标签: bash file awk

我想在文件my_file.dat中获取var1的值(通常是字符串),并将此值保存到x。

我设法使用以下命令执行此操作:

x = `awk '$1 == "var1" {print $2}' my_file.dat`

现在证明在my_file.dat中可能会出现几次var1,例如:

Series1
var1 = temp/data/
Series2
var1 = lost/oldfiles/

那么我的问题是如何才能获得位于'Series1'之后的'var1'的值,这样'x'返回'temp / data /'?

2 个答案:

答案 0 :(得分:0)

根据您发布的样本,您需要的是:

x=$(awk 'prev=="Series1" {print $NF} {prev=$0}' file)

但更强大:

x=$(awk '
    { name=value=$0; sub(/[[:space:]]*=.*/,"",name); sub(/[^=]+=[[:space]]*/,"",value) }
    (prev=="Series1") && (name=="var1") { print value }
    { prev=$0 }
' file)

答案 1 :(得分:0)

解决问题的两台状态机如何:

#!/bin/awk

BEGIN {
    state = 0;
}

{
    if( state == 0 )
    {
        if( index( $1, "Series" nseries ) )
        {
            state = 1
        }
    }
    else
    {
        if( index( $1, "Series" ) > 0 )
        {
            exit
        }

        if( index( $1, "var1" ) > 0 )
        {
            idx = index( $0, "=" )
            str = substr( $0, idx + 1 )
            gsub(/^[ \t]+/, "", str )
            print str
            exit
        }
    }
}

# eof #

测试文件:

Series1
var1 = temp/data/

Series2
var1 = lost/oldfiles/

Series3
var1 = foo/bar/

Series4
var1 = alpha/betta/

Series5
var1 = /foo/this=bad

Series6
var1 = /foo/Series/

var1阅读Series1

x=$(awk -v nseries=1 -f solution.awk -- ./my_file.dat)
echo $x
temp/data/

var1阅读Series5

x=$(awk -v nseries=5 -f solution.awk -- ./my_file.dat)
echo $x
/foo/this=bad

var1阅读Series6

x=$(awk -v nseries=6 -f solution.awk -- ./my_file.dat)
echo $x
/foo/Series/

希望它有帮助!