
tengo una lista enorme como
67603;4716-5469-1335-0870;5450-7938-7992-5530;14523593;03 Oct 2016 - 17:01:15
63123;5592-6762-4853-6320;4532-4142-5613-9690;1441407;03 Oct 2016 - 17:01:15
62562;4532-5581-3790-0140;5292-4905-4356-2840;28898987;03 Oct 2016 - 17:01:15
68080;5188-1564-9611-7580;4556-9998-5999-3300;2262361;03 Oct 2016 - 17:01:15
Quiero buscar más Número duplicado después de 2; y antes del 3;
para la primera línea el número es 5450-7938-7992-5530
y otra línea 4532-4142-5613-9690
y etc.
Respuesta1
Considere el siguiente script awk duplicates.awk
:
#!/usr/bin/awk -f
BEGIN {
RS = "(\r\n|\n\r|\r|\n)"
FS = "[\t\v\f ]*;[\t\v\f ]*"
split("", count)
}
{
count[$3]++
}
END {
for (item in count) {
if (count[item] > 1)
printf "%s\n", item
}
}
Recuerde hacerlo ejecutable, usando por ejemplo chmod a+rx duplicates.awk
. Puede canalizar la entrada al comando o proporcionar uno o más archivos de entrada como parámetros de línea de comando (varios archivos se tratan como si estuvieran concatenados en un solo archivo).
La regla BEGIN establece nuevas líneas universales (es decir, acepta todas las convenciones de nueva línea desde MS-DOS hasta Mac antiguas y Unix) y punto y coma ;
como separador de campos. A modo de ilustración, hice que el separador de campo también consumiera cualquier espacio en blanco que lo rodea, de modo que x;foo bar ; y
se analice en tres campos: x
, foo bar
y y
.
La regla de registro (la parte central del fragmento) se aplica a cada registro (línea) de la entrada. Debido a que awk admite matrices asociativas, simplemente usamos el tercer campo, una cadena, como clave para count
la matriz e incrementamos esa entrada en uno. (Incrementar una entrada de matriz inexistente en awk produce 1, por lo que el primer incremento produce 1 y el código funciona como era de esperar).
La regla FINALIZAR escanea la count
matriz e imprime las entradas que ocurrieron al menos dos veces. Tenga en cuenta que esta salida está en orden aleatorio. (Hay formas de ordenar la salida según el número de apariciones, o incluso de mantener el orden original (de las primeras apariciones) en el archivo, pero OP no mencionó ningún requisito respecto al orden, así que no me molesté; undefinido El orden es el más sencillo de implementar.)
Si desea imprimir, por ejemplo, el número de apariciones seguidas de la cadena (el valor de la tercera columna), utilice la siguiente regla FINAL:
END {
for (item in count)
printf "%15d %s\n", count[item], item
}
La salida está formateada de modo que los primeros quince caracteres de la salida estén reservados para el número y el valor comience en el carácter 17.
Respuesta2
Crear algunos valores duplicados en el archivo stack.txt y luego imprimir el resultado.
67603;4716-5469-1335-0870;5450-7938-7992-5530;14523593;03 Oct 2016 - 17:01:15
63123;5592-6762-4853-6320;4532-4142-5613-9690;1441407;03 Oct 2016 - 17:01:15
62562;4532-5581-3790-0140;5292-4905-4356-2840;28898987;03 Oct 2016 - 17:01:15
68080;5188-1564-9611-7580;4556-9998-5999-3300;2262361;03 Oct 2016 - 17:01:15
67603;4716-5469-1335-0870;5450-7938-7992-5530;14523593;03 Oct 2016 - 17:01:15
63123;5592-6762-4853-6320;4532-4142-5613-9690;1441407;03 Oct 2016 - 17:01:15
62562;4532-5581-3790-0140;5292-4905-4356-2840;28898987;03 Oct 2016 - 17:01:15
68080;5188-1564-9611-7580;4556-9998-5999-3300;2262361;03 Oct 2016 - 17:01:15
67603;4716-5469-1335-0870;5450-7938-7992-5530;14523593;03 Oct 2016 - 17:01:15
63123;5592-6762-4853-6320;4532-4142-5613-9690;1441407;03 Oct 2016 - 17:01:15
Utilice el siguiente comando:
awk 'BEGIN{FS=";"}{a[$3]++} END {for(k in a) print a[k],k}' stack.txt
Producción -
3 4532-4142-5613-9690
2 5292-4905-4356-2840
3 5450-7938-7992-5530
2 4556-9998-5999-3300