我想在文件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 /'?
答案 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/
希望它有帮助!