我有一個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
給出前五個結果。sort
head
計數是透過遞增關聯數組中的元素來完成的c
,其中當前輸入行用作鍵。
該END
區塊(在讀取 的最後一行後觸發file.log
)迭代 中的所有鍵c
,如果該鍵對應的計數大於或等於 10,則該計數將與具有該計數的行一起列印。
答案3
sort file.log | uniq -c | sort -rn | awk '{if($1 >= 10 && $1 <= 20){{print $1, $2}}}'