在awk中为一条记录累积多个值

时间:2018-04-24 11:29:39

标签: unix 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

我想输出as,对照第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  

2 个答案:

答案 0 :(得分:1)

如果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

答案 1 :(得分:0)

在awk中,不是通常的方式,而是首先设置$3|$5,然后向<-;$3|$5;->添加$3;$3|$5;$5;dash而不是dash; {1}}:

$ awk '
BEGIN { FS=OFS="|" }
{
    a[$1 OFS $2]=$3(a[$1 OFS $2]?";"a[$1 OFS $2]";":"|")$5
}
END {
    for(i in a)
        print i,a[i]
}' file
2|dev|;dash|minus;plus
1|ana|peter;jhon|plus;plus
1|dev|Smith|minus

正确的awk方式可能更接近:

$ awk '
BEGIN { FS=OFS="|" }
{
    i=$1 OFS $2
    a[i] = a[i] ( a[i]=="" || $3=="" ? "" : ";" ) $3
    b[i] = b[i] ( b[i]=="" || $5=="" ? "" : ";" ) $5
}
END {
    for(i in a)
        print i,a[i],b[i]
}' file
2|dev|dash|minus;plus
1|ana|jhon;peter|plus;plus
1|dev|Smith|minus