Datei nach Duplikaten sortieren, wenn diese größer als eine bestimmte Zahl sind

Datei nach Duplikaten sortieren, wenn diese größer als eine bestimmte Zahl sind

Ich habe eine file.logDatei 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 10sie 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 „ 5und 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 headdie 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 awkdie Ergebnisse filtern:

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

Das awkam Ende druckt nur die Zeilen, die Zählungen größer oder gleich 10 entsprechen. Das headamsehrend 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. awkAnschließend werden Ihnen die fünf besten Ergebnisse davon mit sortund 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 ENDBlock (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}}}'

verwandte Informationen