我尝试根据第一个字段中的值合并列。我尝试过使用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
提前感谢任何建议!
答案 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
请注意,输出顺序无法保证,但您可以按第一个字段排序。