如何解决awk 数组已创建但元素丢失
userX 2020 start id1
userY 2005 stop id2
userZ 2006 start id3
userT 2014 stop id1
userX 2010 stop id1
我想创建一个数组,其中年份值 $2
是具有给定条件 $1$4
的每个唯一用户 ID 对 $3=="stop"
的元素。例如 arr[userXid1]=2010
和 arr[userTid1]=2014
我的代码:
awk '{if($3=="stop") arr[$1$4]=$2} END{print arr[userXid1]}' log
预期输出:
2010
但是这会打印空行。当我 print length(arr)
时,它给出 3
是有道理的。但是 $2
值不存在,我不知道为什么。任何帮助表示赞赏。
awk '{if($3=="start") arrstart[$1,$4]=$2; else if($3=="stop") arrstop[$1,$4]=$2 fi; next} END{for(i in arrstop) if(arrstart[i]>arrstop[i]) print i}' SUBSEP=':' log
附加:最终代码,与问题无关。
解决方法
您可以使用此awk
:
awk '$3 == "stop" {arr[$1,$4] = $2} END {print arr["userX","id1"]}' file
2010
要打印所有唯一值,请使用:
awk '$3 == "stop" {arr[$1,$4] = $2}
END {for (i in arr) print i,arr[i]}' SUBSEP=':' file
userY:id2 2005
userT:id1 2014
userX:id1 2010
,
使用 tac
+ awk
组合,您可以尝试仅获取第一个、第四个字段值的最后一个唯一组合。
tac Input_file | awk '!arr[$1,$4]++ && $3=="stop"{print $2;exit}'
说明: 简单的说明是,先通过 tac
反转 Input_file,然后将其作为标准输入传递给 awk
程序作为输入,在 awk
程序中打印 $1,$4 的第一个唯一组合,然后打印该行的第二个字段,并通过 exit
立即退出程序。
OR 您想分别在第 4 个和第 1 个字段(仅包含最后一个值)中专门查找键 id1
和 userX
,然后尝试关注。
tac file1 | awk '$1=="userX" && $4=="id1" && $3=="stop"{print $2;exit}'
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。