Ich habe eine file.log
Datei mit Daten, die möglicherweise mehr als einmal vorkommen, aber nicht müssen.
a
b
c
a
d
b
a
a
a
a
b
z
d
e
f
e
Ich sortiere sort file.log | uniq -c | sort -rn | head -n 10
sie derzeit nach der Anzahl der in der Datei gefundenen Duplikate, erhalte aber nur die 10 häufigsten Vorkommen. Wenn also beispielsweise ein Zeichen 5 Mal in der Datei vorkommt, wird „ 5
und das entsprechende Zeichen“ angezeigt.
Wie kann ich die Zeilen ausgeben, um die Zeichen mit mehr als einer bestimmten Anzahl von Vorkommen/Duplikaten in der Datei zu erhalten? Zum Beispiel, um nur die Zeichen zu erhalten, die mehr als 10 Mal vorkommen. Und vorzugsweise eine Möglichkeit, zu definieren, wie viele dieser Zeichen ausgegeben werden sollen, zum Beispiel nur 5 Ergebnisse von Zeichen, die 10 oder mehr Duplikate haben.
Antwort1
Wenn Sie anhand Ihrer Eingabe herausfinden möchten, welche Zeichen größer oder gleich dreimal vorkommen, führen Sie eine Zählung durch und geben Sie die Zeile beim dritten Mal aus.
$ awk '++count[$0] == 3' file
a
b
Leiten Sie das weiter, um head
die Ausgabe zu begrenzen. Dies sortiert eindeutig nicht nach der Anzahl der Vorkommen. Um das zu tun, verwenden Sie 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
Ausgänge
6 a
3 b
2 d
Referenzhttps://www.gnu.org/software/gawk/manual/html_node/Controlling-Scanning.html
Antwort2
Sie könnten den Anfang Ihrer ursprünglichen Pipeline verwenden und dann awk
die Ergebnisse filtern:
sort file.log | uniq -c | sort -rn | awk '$1 >= 10' | head -n 5
Das awk
am Ende druckt nur die Zeilen, die Zählungen größer oder gleich 10 entsprechen. Das head
amsehrend begrenzt das Gesamtergebnis auf maximal fünf Zeilen.
Sie können jedoch noch etwas mehr tun awk
:
awk '{ c[$0]++ } END { for (w in c) if (c[w] >= 10) print c[w], w }' file.log |
sort -nr | head -n 5
Dadurch wird zunächst das Zählen und Aussortieren von Zeilen mit niedriger Anzahl in durchgeführt. awk
Anschließend werden Ihnen die fünf besten Ergebnisse davon mit sort
und angezeigt head
.
Die Zählung erfolgt durch Inkrementieren eines Elements in einem assoziativen Array c
, wobei die aktuelle Eingabezeile als Schlüssel verwendet wird.
Der END
Block (der nach dem Lesen der letzten Zeile von ausgelöst wird file.log
) iteriert über alle Schlüssel in c
, und wenn der Schlüssel einer Anzahl größer oder gleich 10 entspricht, wird die Anzahl zusammen mit der Zeile mit dieser Anzahl ausgedruckt.
Antwort3
sort file.log | uniq -c | sort -rn | awk '{if($1 >= 10 && $1 <= 20){{print $1, $2}}}'