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

问题描述 投票:0回答: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 列的记录累积到 1 条

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  
unix awk
2个回答
1
投票

使用较新版本的 datamash

$ datamash -t'|' -c';' -g 1,2 collapse 3,5 <ip.txt
1|dev|Smith|minus
1|ana|jhon;peter|plus;plus
2|dev|dash;|minus;plus
  • -g 1,2
    按第一列和第二列分组
  • collapse 3,5
    合并这些列值
  • -t'|'
    输入字段分隔符(默认为制表符)
  • -c';'
    折叠分隔符(默认为逗号字符)

0
投票

在 awk 中,不是通常的方式,而是先设置

$3|$5
,然后向外添加
<-;$3|$5;->
$3;$3|$5;$5
,这就是为什么
;dash
而不是
dash;
:

$ 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
© www.soinside.com 2019 - 2024. All rights reserved.