簡體   English   中英

awk分組依據,如果符合條件則打印

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM