[英]awk group by and print if matches a condition
我有這個結構:
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。
提前致謝。
如何保存顯示的值(優先選擇“ 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要求。 現在,第一行將數字轉換為“上”或“下”。
它類似於三元組 ,但是恕我直言,它有足夠的不同來單獨給出答案,尤其是我認為,通過在變量已被“ upup”時跳過處理,邏輯流程會更加清晰,並辨別出不同的可能$ 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
但這取決於個人喜好,因此我將兩個版本都保留在答案中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.