Tengo un comando (cmd1) que hace greps a través de un archivo de registro para filtrar un conjunto de números. Los números están en orden aleatorio, así que utilizo sort -gr para obtener una lista de números ordenados al revés. Puede haber duplicados dentro de esta lista ordenada. Necesito encontrar el recuento de cada número único en esa lista.
Por ejemplo, si la salida de cmd1 es:
100
100
100
99
99
26
25
24
24
Necesito otro comando al que pueda canalizar la salida anterior, de modo que obtengo:
100 3
99 2
26 1
25 1
24 2
bash
command-line
sorting
count
duplicates
letronje
fuente
fuente

Respuestas:
qué tal si;
$ echo "100 100 100 99 99 26 25 24 24" \ | tr " " "\n" \ | sort \ | uniq -c \ | sort -k2nr \ | awk '{printf("%s\t%s\n",$2,$1)}END{print}'El resultado es :
fuente
100 3 99 2 26 1 25 1 24 2 2 24echo "100 100 100 99 99 26 25 24 24" | tr " " "\n" | sort | uniq -c | sort -k2nr | awk '{printf("%s\t%s\n",$2,$1)}END{print}' | head -n -1así obtienes:100 3 99 2 26 1 25 1 24 2uniq -cfunciona para GNU uniq 8.23 al menos, y hace exactamente lo que quiere (asumiendo una entrada ordenada).fuente
sortcomando:sort file_name | uniq -csi el orden no es importante
# echo "100 100 100 99 99 26 25 24 24" | awk '{for(i=1;i<=NF;i++)a[$i]++}END{for(o in a) printf "%s %s ",o,a[o]}' 26 1 100 3 99 2 24 2 25 1fuente
Ordene numéricamente los números al revés, luego cuente los duplicados, luego intercambie las palabras izquierda y derecha. Alinear en columnas.
printf '%d\n' 100 99 26 25 100 24 100 24 99 \ | sort -nr | uniq -c | awk '{printf "%-8s%s\n", $2, $1}'fuente
En Bash, podemos usar una matriz asociativa para contar instancias de cada valor de entrada. Suponiendo que tenemos el comando
$cmd1, por ejemplo#!/bin/bash cmd1='printf %d\n 100 99 26 25 100 24 100 24 99'Luego, podemos contar valores en la variable de matriz
ausando el++operador matemático en las entradas de matriz relevantes:while read i do ((++a["$i"])) done < <($cmd1)Podemos imprimir los valores resultantes:
for i in "${!a[@]}" do echo "$i ${a[$i]}" doneSi el orden de salida es importante, es posible que necesitemos un externo
sortde las claves:for i in $(printf '%s\n' "${!a[@]}" | sort -nr) do echo "$i ${a[$i]}" donefuente