2016-09-16 5 views
1

my_file.dat 파일에서 var1 값 (일반적으로 문자열)을 가져 와서이 값을 x에 저장하려고합니다.AWK를 사용하여 파일에서 여러 번 변수를 읽음

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

내 질문은 :

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

그것은 지금 my_file.dat에서 var1에 여러 발생, 예를 들어있을 수 있음을 밝혀 :

나는 다음과 같은 명령을 사용하여이 작업을 수행하기 위해 관리 그러면 'x'가 'temp/data /'를 반환하도록 'Series1'줄 바로 다음에있는 'var1'값만 가져올 수 있습니까? 당신은 당신이 필요로하는 모든 게시 된 샘플을 감안할 때

+3

x ='awk '$ 1 == "var1"{print $ 2}'my_file.dat '은 유효한 명령이 아닙니다. 'x = $ (awk '...'파일)'을'='주위에 공백없이 쓸 수 있습니다. – fedorqui

+0

'{print $ NF; exit}'해야합니다. – 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/ 

Series1에서 var1 읽기 :

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

Series5에서 var1 읽기 :

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

Series6에서 var1 읽기 :

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

는 희망이 도움이!

+0

파일 이름에 '='이 포함되어 있으면 오류가 발생합니다 (예 : 'tmp1 =/foo/this = bad' 또는'Series' 또는 유사합니다. –

+0

@ Edmonton : 해결 된 문제! 그것은 나를 가리키는 Thx! – Lacobus

관련 문제