2

我有这个示例文件

userX   2020    start   id1
userY   2005    stop    id2
userZ   2006    start   id3
userT   2014    stop    id1
userX   2010    stop    id1

我想创建一个数组,其中年份值是每个具有给定条件$2的唯一用户 ID 对的元素。例如和$1$4$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

补充:最终代码,与问题无关。

4

2 回答 2

2

你可以使用这个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
于 2021-07-14T10:51:01.140 回答
1

使用tac+awk组合,您可以尝试仅获取第一个、第四个字段值的最后一个唯一组合。

tac Input_file | awk '!arr[$1,$4]++ && $3=="stop"{print $2;exit}'

解释:简单的解释是,tac先将 Input_file 反转,然后将其作为标准输入传递给awk程序作为输入,在awk程序中打印 $1,$4 的第一个唯一组合,然后打印该行的第二个字段并立即退出程序由exit.

或者您想分别在第 4 和第 1 个字段(仅使用它们的最后一个值)中id1userX

tac file1 | awk '$1=="userX" && $4=="id1" && $3=="stop"{print $2;exit}'
于 2021-07-14T10:56:39.857 回答