微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

awk 数组已创建但元素丢失

如何解决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]=2010arr[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 个字段(仅包含最后一个值)中专门查找键 id1userX,然后尝试关注。

tac file1 | awk '$1=="userX" && $4=="id1" && $3=="stop"{print $2;exit}'

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。