Arrays awk:基于另一个公共字段枚举字段
这很可能是通过数组实现的,但我不知道如何构建逻辑 输入:Arrays awk:基于另一个公共字段枚举字段,arrays,awk,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中,然后通过迭代array2中的元素来搜索array1来实现的 awk -v OFS=, '{
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
中,然后通过迭代array2
中的元素来搜索array1
来实现的
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
测试结果:
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
说明:
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
下面的三元运算符
与
与
$datamash-W-t'-g1,2 collapse 3谢谢,它按预期工作。我不能说我能破译整个代码,这样我就能更好地理解它是如何工作的。具体地说,这些部分:k=$1子集$2
和arr[k]=arr中的k?arr[k]OFS$3:$0
@增加一艘班轮explanation@Akshay,感谢分享精彩的回答。解释得非常好。我不知道datamash
,语法看起来更简单更干净,不幸的是,默认情况下它没有安装在我的目标环境中。但我们会记住这一点,以备将来使用。
arr[k] = k in arr ? arr[k] OFS $3 : $0;
if(k in arr){
arr[k] = arr[k] OFS $3
}else{
arr[k] = $0
}