linux - awk group by 并在符合条件时打印

标签 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"并将两个结果合二为一。但是有了这个,我就有了 up 和 down 的重复值。

有时,我收到的不是起伏,而是 0、1、2、3、4,这是更多变量,向上状态是 0 和 1。

提前致谢。

最佳答案

如何保存您看到的值,并优先选择“向上”?

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 要求。第一行现在将数字转换为“向上”或“向下”。

关于linux - awk group by 并在符合条件时打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26542052/

相关文章:

linux - 如何在 linux (cent os) 中通过 sed 编辑特定行并替换文本

linux - 如何在 linux (Debian jessie) 上打开一个端口

php - Cron 执行的 Bash 脚本中的 PHP 脚本序列未运行

bash - 用不同的颜色显示多个文件?

linux - 如何在 Linux 中更改从特定行开始的列数据

linux - 启用 Systemd 的服务不再在启动时启动

linux - 如何比较bash中的2个范围列表?

bash - 检查图像是否为 :tag combination already exists on docker hub

awk 系统命令,参数中有空格

bash - 使用 awk 或 sed 更改模式后的下一行