AWK 在浮动定界符之后获取字符串
AWK get strings after floating delimiters
我需要验证像这样乱序打印变量的脚本的输出。
proc:123 id:456 zzz:aaa xxx:ccc
xxx: ccc id: 654 proc: 321 zzz: aaa yyy:111
...
我需要获取“proc”值和“id”,但随着位置的变化,我不知道如何使用 awk 来完成。
如果字段像这样保持相同的位置
proc:123 id:456 zzz:aaa xxx:ccc
这样就可以了
awk '$2 == "123" && $4 != "456" {print "something"}'
但是由于字段是动态的,我有点卡住了
谢谢
$ awk '{
for(i=1;i<NF;i++) # iterate all awk default-separated fields
if($i~/^(proc|id):$/) # looking for proc: and id:
a[$i]=$(i+1) # get value to an indexed array element
if(a["proc:"]=="123"&&a["id:"]=="456") { # once you got both
print # print
delete a # delete a for next round
}
}' file
输出:
proc: 123 id: 456 zzz: aaa xxx: ccc
如果数据实际上是:proc:123 id:456 ...
.
,则失败
一旦您使用此代码隔离出字段值,您就可以对其执行任何形式的过滤逻辑。它甚至可以处理字段值中的 multi-byte unicode 数据。
{m,g}awk '
BEGIN {
_ = index(FS="[ \t:]+", OFS)
__ = """(proc|id)[ \t]*[:][ \t]*[^ \t]+"
} NF * ( \
$!NF = sprintf("%.0s%.0s row: %5.f | proc: %6s | id: %6s | orig [=10=]:\f %s", ___=$+__,
NF *= gsub(__,"& ")* gsub("(^|)[^]*(|$)","")*\
gsub( "^" FS "|" FS "$", "")^!_,
NR, $(_^(/^i/)*_), $(_^(/^p/)*_), ___))^!_'
————————————————————————————————
row: 1 | proc: 123 | id: 456 | orig [=11=]:
proc: 123 id: 456 zzz: aaa xxx: ccc
row: 3 | proc: 321 | id: 654 | orig [=11=]:
xxx: ccc id: 654 proc: 321 zzz: aaa yyy:111
row: 4 | proc: 123뀿abc | id: 456_987 | orig [=11=]:
proc: 123뀿abc id: 456_987 zzz: aaa xxx: ccc
我需要验证像这样乱序打印变量的脚本的输出。
proc:123 id:456 zzz:aaa xxx:ccc
xxx: ccc id: 654 proc: 321 zzz: aaa yyy:111
...
我需要获取“proc”值和“id”,但随着位置的变化,我不知道如何使用 awk 来完成。 如果字段像这样保持相同的位置
proc:123 id:456 zzz:aaa xxx:ccc
这样就可以了
awk '$2 == "123" && $4 != "456" {print "something"}'
但是由于字段是动态的,我有点卡住了
谢谢
$ awk '{
for(i=1;i<NF;i++) # iterate all awk default-separated fields
if($i~/^(proc|id):$/) # looking for proc: and id:
a[$i]=$(i+1) # get value to an indexed array element
if(a["proc:"]=="123"&&a["id:"]=="456") { # once you got both
print # print
delete a # delete a for next round
}
}' file
输出:
proc: 123 id: 456 zzz: aaa xxx: ccc
如果数据实际上是:proc:123 id:456 ...
.
一旦您使用此代码隔离出字段值,您就可以对其执行任何形式的过滤逻辑。它甚至可以处理字段值中的 multi-byte unicode 数据。
{m,g}awk '
BEGIN {
_ = index(FS="[ \t:]+", OFS)
__ = """(proc|id)[ \t]*[:][ \t]*[^ \t]+"
} NF * ( \
$!NF = sprintf("%.0s%.0s row: %5.f | proc: %6s | id: %6s | orig [=10=]:\f %s", ___=$+__,
NF *= gsub(__,"& ")* gsub("(^|)[^]*(|$)","")*\
gsub( "^" FS "|" FS "$", "")^!_,
NR, $(_^(/^i/)*_), $(_^(/^p/)*_), ___))^!_'
————————————————————————————————
row: 1 | proc: 123 | id: 456 | orig [=11=]:
proc: 123 id: 456 zzz: aaa xxx: ccc
row: 3 | proc: 321 | id: 654 | orig [=11=]:
xxx: ccc id: 654 proc: 321 zzz: aaa yyy:111
row: 4 | proc: 123뀿abc | id: 456_987 | orig [=11=]:
proc: 123뀿abc id: 456_987 zzz: aaa xxx: ccc