awk group by和print如果匹配条件

时间:2014-10-24 05:33:10

标签: linux bash awk

我有这个结构:

aaa,up
bbb,down
aaa,down
aaa,down
aaa,up
bbb,down
ccc,down
ccc,down
ddd,up
ddd,down

我希望得到下一个输出:

aaa,up
bbb,down
ccc,down
ddd,up

所以,第一件事就是分组。然后,如果打印出至少一行,则打印下来。

到目前为止,我有这个:

awk -F"," '$2=="up"{arr[$1]++}END{for (a in arr) print a,arr[a]}'

然后我更改$ 2 ==" down"并将两个结果合二为一。但是,有了这个,我有重复的值,包括向上和向下。

有时候,我会收到0,1,2,3,4而不是起伏,这些变量更多,而且状态为0和1。

提前致谢。

2 个答案:

答案 0 :(得分:3)

如何保存您看到的值,优先选择" up"?

awk -F "," '$2 ~ /0^(0|1)$/ { $2 = "up" }
    $2 ~ /^[2-9]/ { $2 = "down" }
    $2 == "up" || !($1 in a) { a[$1]=$2 }
    END { OFS=FS; for(k in a) print k, a[k] }' file | sort

也就是说,如果值是" up",我们总是保存它。否则,我们只保存值,如果我们还没有此密钥的值。

我不确定我是否抓住了你的0,1,2,3,4要求。第一行现在将一个数字转换为" up"或" down"。

答案 1 :(得分:1)

它与triplee类似,但是它本身就足够不同了,特别是我认为当变量已被“上升”时,跳过处理会更清楚逻辑流程,并且区分$ 2的不同可能类型的工作被处理为一个简单的用户函数

awk -F"," '
function up_p(x){
    if(x==0||x=="down") return "down"; else return "up"
    }
a[$1]=="up" {next}
            {a[$1]=up_p($2)}
END         {for(k in a) print k "," a[k]}' file | sort
aaa,up
bbb,down
ccc,down
ddd,up

第二个想法,用户功能是不必要的......

awk -F"," '
a[$1]=="up" {next}
            {a[$1]=($2==0||$2=="down")?"down":"up"}
END         {for(k in a) print k "," a[k]}' file | sort
aaa,up
bbb,down
ccc,down
ddd,up

但是归结为个人品味所以我在答案中留下了两个版本。