首页 > 解决方案 > 在 awk 中针对一条记录累积多个值

问题描述

我有文件

1|dev|Smith|78|minus  
1|ana|jhon|23|plus  
1|ana|peter|22|plus  
2|dev|dash|45|minus  
2|dev||44|plus

我希望输出为,针对第 1 列和第 2 列的 uniq 值打印第 3 列和第 5 列的多个值

1|dev|Smith|minus  
1|ana|jhon;peter|plus;plus  
2|dev|dash;|minus;plus

我可以为一列将多条记录累积到 1 中,我想在一个命令中为 2 列执行此操作

awk -F"|" '{if(a[$1"|"$2])a[$1"|"$2]=a[$1"|"$2]";"$5; else
a[$1"|"$2]=$5;}END{for (i in a)print i, a[i];}' OFS="|" input.txt > output.txt

它给出的输出为

2|dev|minus;plus  
1|ana|plus;plus  
1|dev|minus  

标签: unixawk

解决方案


如果datamash没问题

$ # -g 1,2 tells to group by 1st and 2nd column
$ # collapse 3 collapse 5 tells to combine those column values
$ datamash -t'|' -g 1,2 collapse 3 collapse 5 < ip.txt 
1|dev|Smith|minus
1|ana|jhon,peter|plus,plus
2|dev|dash,|minus,plus

$ # easy to change , to ; if input file doesn't contain ,
$ datamash -t'|' -g 1,2 collapse 3 collapse 5 < ip.txt | tr ',' ';'
1|dev|Smith|minus
1|ana|jhon;peter|plus;plus
2|dev|dash;|minus;plus

推荐阅读