我的文件为
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
使用较新版本的 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';'
折叠分隔符(默认为逗号字符)在 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