Unix 针对awk中的一条记录累积多个值

Unix 针对awk中的一条记录累积多个值,unix,awk,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 我希望输出为,对照第1列和第2列的uniq值,打印第3列和第5列的多个值 1|dev|Smith|minus 1|ana|jhon;peter|plus;plus 2|dev|dash;|minus;plus 我可以只为一列将多个记录累加到1中,我想在一个命令中为2列累

我的档案是

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  
如果可以的话

$#-g 1,2告诉按第1列和第2列分组
$#collapse 3 collapse 5告诉您如何组合这些列值
$datamash-t'|'-g1,2折叠3折叠5
在awk中,不是通常的方式,而是首先设置
$3 |$5
,然后向外添加,如
$3$3|$5;$5
,这就是为什么
;破折号
代替
破折号

$ 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

请将文件数据编辑为单空格(每行前放四个空格)。但是,更重要的是,StackOverflow不会编写代码或教您如何编写代码,它可以帮助您解决代码中自己无法解决的问题。第一步必须是你的,而不是我们的。这是我的第一篇帖子,更新了我的处理尝试谢谢你发布你的尝试。我提交了一份编辑文件以正确格式化代码/数据。请看一看,看看如何将其应用于未来的问题(它使阅读更容易)。
$ 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