如果大於一定數量,則對文件中的重複項進行排序

如果大於一定數量,則對文件中的重複項進行排序

我有一個file.log文件,其中的數據可能會或可能不會出現多次。

a
b
c
a
d
b
a
a
a
a
b
z
d
e
f
e

我目前正在sort file.log | uniq -c | sort -rn | head -n 10按照文件中找到的重複項數量對它們進行排序,但我得到的是出現次數最多的 10 個。例如,如果一個字元在檔案中重複出現 5 次,則會顯示5和 與其對應的字元。

如何輸出行以取得文件中出現次數/重複次數超過一定次數的字元?例如只取得出現次數超過 10 次的字元。並且最好是定義要輸出多少個字元的方法,例如僅輸出具有 10 個或更多重複項的字元的 5 個結果。

答案1

使用給定的輸入,如果您想查找哪些字元出現大於或等於三次:保留計數並在第三次出現時輸出該行

$ awk '++count[$0] == 3' file
a
b

透過管道將head其限制輸出。這顯然不會按出現次數排序。為此,請使用 GNU awk:

gawk -v limit=3 '
    { ++count[$0] }
    END {
        PROCINFO["sorted_in"] = "@val_num_desc"
        n = 0
        for (line in count) {
            if (n == limit) break
            print count[line], line
            ++n
        }
    }
' file

輸出

6 a
3 b
2 d

參考號https://www.gnu.org/software/gawk/manual/html_node/Controlling-Scanning.html

答案2

您可以使用原始管道的開頭,然後awk過濾這些結果:

sort file.log | uniq -c | sort -rn | awk '$1 >= 10' | head -n 5

最後的 只列印awk那些對應於大於或等於 10 的計數的行head非常end 將整體結果限制為最多五行。

不過你可以多做一點awk

awk '{ c[$0]++ } END { for (w in c) if (c[w] >= 10) print c[w], w }' file.log |
sort -nr | head -n 5

首先進行計數並清除低計數行,然後使用並awk給出前五個結果。sorthead

計數是透過遞增關聯數組中的元素來完成的c,其中當前輸入行用作鍵。

END區塊(在讀取 的最後一行後觸發file.log)迭代 中的所有鍵c,如果該鍵對應的計數大於或等於 10,則該計數將與具有該計數的行一起列印。

答案3

sort file.log | uniq -c | sort -rn | awk '{if($1 >= 10 && $1 <= 20){{print $1, $2}}}'

相關內容