2016-09-16 78 views
1

我想在文件my_file.dat中获取var1的值(通常是字符串)并将此值保存到x。使用AWK从文件中读取多个事件的变量

我能够做到这一点使用下面的命令:

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 /'?

+3

x ='awk'$ 1 ==“var1”{print $ 2}'my_file.dat'不是一个有效的命令。你可能想说'x = $(awk'...'文件)',''''周围没有空格。 – fedorqui

+0

'{print $ NF;退出}'应该这样做。 – karakfa

回答

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) 
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/ 

阅读从Series1var1

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

阅读从Series5var1

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

阅读从Series6var1

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

希望它能帮助!

+0

当文件名包含“=”时,将会失败'tmp1 =/foo/this = bad'或'Series'或类似。 –

+0

@EdMorton:问题解决! Thx指出我! – Lacobus