基于字段值linux合并行

时间:2017-11-28 16:32:53

标签: python linux awk merge

我尝试根据第一个字段中的值合并列。我尝试过使用awk,但无济于事。请参阅示例输入和输出:

Input:  
10013   97      1503384  
10013   196     1506234  
10013   61      1507385  
10013   1559    1508385  
10014   1726    1514507  
10014   960     1519162  
10015   1920    1545535  
10015   124     1548915  
10015   77      1550284  

Desired_Output:  
10013   97,196,61,1559  1503384,1506234,1507385,1508385  
10014   1726,960        1514507,1519162  
10015   1920,124,77     1545535,1548915,1550284  

提前感谢任何建议!

4 个答案:

答案 0 :(得分:2)

最短的GNU arr2 解决方案:

datamash
  • datamash -sW -g1 collapse 2 collapse 3 <file - 第1场分组
  • -g1 - 在每个组中生成字段collapse N的所有输入值的逗号分隔列表的操作

输出:

N

答案 1 :(得分:1)

$ cat tst.awk
$1 != f1 { if (NR>1) print f1, f2, f3; f1=f2=f3=s="" }
{ f1=$1; f2=f2 s $2; f3=f3 s $3; s="," }
END { print f1, f2, f3 }

$ awk -f tst.awk file | column -t
10013  97,196,61,1559  1503384,1506234,1507385,1508385
10014  1726,960        1514507,1519162
10015  1920,124,77     1545535,1548915,1550284

答案 2 :(得分:0)

Awk 解决方案(假设输入行已经排序):

awk '!a[$1]++{ if ("f2" in b) { print f1, b["f2"], b["f3"]; delete b } }
     { 
         f1=$1; 
         b["f2"]=(b["f2"]!=""? b["f2"]",":"")$2; 
         b["f3"]=(b["f3"]!=""? b["f3"]",":"")$3 
     }
     END{ print f1, b["f2"], b["f3"] }' OFS='\t file
  • delete b - 通过此操作,我们将阻止数组b在处理过程中保存所有值(保存内存)。它将在每个唯一的第一个字段值
  • 上清除

输出:

10013   97,196,61,1559  1503384,1506234,1507385,1508385
10014   1726,960    1514507,1519162
10015   1920,124,77 1545535,1548915,1550284

答案 3 :(得分:0)

awk救援!

$ awk '{f2[$1]=f2[$1] sep[$1] $2;                   # concatenate 2nd field 
        f3[$1]=f3[$1] sep[$1] $3;                   # concatenate 3rd field 
        sep[$1]=","}                                # lazy init separator to skip first
   END {for(k in f2) print k,f2[k],f3[k]}' file |   # iterate over keys and print
  column -t                                         # pretty print


10013  97,196,61,1559  1503384,1506234,1507385,1508385
10014  1726,960        1514507,1519162
10015  1920,124,77     1545535,1548915,1550284

请注意,输出顺序无法保证,但您可以按第一个字段排序。