我有这个结构:
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。
提前致谢。
答案 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
但是归结为个人品味所以我在答案中留下了两个版本。