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
}