arrays - awk:基于另一个公共字段枚举字段
问题描述
这很可能是用数组完成的,但我不知道如何构建逻辑。
输入:
uid1 ip1 tag1
uid1 ip1 tag2
uid2 ip2 tag3
uid2 ip2 tag4
uid2 ip2 tag5
期望的输出:
uid1 ip1 tag1,tag2
uid2 ip2 tag3,tag4,tag5
我在想,也许这可以通过将所有元素存储在 中array1
,然后将uid
+ip
字段存储在 中,然后通过从 中迭代元素array2
进行搜索来实现。array1
array2
解决方案
awk -v OFS=, '{
k=$1 SUBSEP $2;
arr[k] = k in arr ? arr[k] OFS $3 : $0;
}
END{
for(i in arr)
print arr[i]
}' infile
试验结果:
$ cat f1
uid1 ip1 tag1
uid1 ip1 tag2
uid2 ip2 tag3
uid2 ip2 tag4
uid2 ip2 tag5
$ awk -v OFS=, '{k=$1 SUBSEP $2; arr[k] = k in arr ? arr[k] OFS $3 : $0;}END{for(i in arr)print arr[i]}' f1
uid1 ip1 tag1,tag2
uid2 ip2 tag3,tag4,tag5
解释:
awk -v OFS=, '{ # output field separator
# variable k contains field1 value
# and SUBSEP - Multi-dimensional array separator
# and column 2 value
k=$1 SUBSEP $2;
# arr -> array
# if array key that is variable k already exists in array arr
# then arr[k] will be existing content of arr[k] plus
# field separator (comma) and then field 3 contents
# else entire row/record which is when array does not have index already
arr[k] = k in arr ? arr[k] OFS $3 : $0;
}
END{ # END block
# iterate through array arr
# and print array value
for(i in arr)
print arr[i]
}' infile
下面的三元运算符
arr[k] = k in arr ? arr[k] OFS $3 : $0;
与
if(k in arr){
arr[k] = arr[k] OFS $3
}else{
arr[k] = $0
}
推荐阅读
- javafx - 从不同的线程访问 JavaFX UI 元素?
- amazon-web-services - 调用 EnableAWSServiceAccess 操作时:您指定了无法识别的服务主体
- postgresql - TimescaleDB/Postgres 占用的空间比预期的要多得多
- laravel - Laravel Guzzle Basic Auth 成功返回空
- python - 使用复合索引从 DataFrame 中提取值的正确方法?
- java - 无法传输工件传输失败
- r - 使用多个条件查找(或合并)2 个数据帧
- c# - 将 G Suite 驱动器文件和文件夹从一个域复制到另一个域
- python - 在集合中查找内容与在 python 中查找列表的速度
- node.js - 如何使用firebase函数刷新google oauth2上的令牌?