Tengo un archivo csv de 7 GB del que necesito encontrar los primeros n valores que ocurrieron principalmente en la quinta columna. El formato de mi archivo es el siguiente:
"instance id","src IP","destination ip","63812","389" "instance id","src IP","destination ip","389","65311" "instance id","src IP","destination ip","63812","389" "instance id","src IP","destination ip","88","49194" "instance id","src IP","destination ip","12489","49194" "instance id","src IP","destination ip","63812","389" "instance id","src IP","destination ip","63812","389" Usando el siguiente comando awk -F , ' !count[$5]++ {save[$5] = $0; next} count[$5] > 0 { print save[$5] " is " count[$5] " times"} ' example.csv capaz de encontrar el siguiente resultado
"instance id","src IP","destination ip","63812","389" is 1 times "instance id","src IP","destination ip","389","65311" is 1 times "instance id","src IP","destination ip","63812","389" is 2 times "instance id","src IP","destination ip","88","49194" is 1 times "instance id","src IP","destination ip","12489","49194" is 2 times "instance id","src IP","destination ip","63812","389" is 3 times "instance id","src IP","destination ip","63812","389" is 4 timespero no puedo entender cómo obtener las 50 filas principales en las que la entrada de la quinta columna se duplicó la mayor parte del tiempo.
Supongamos que si n=2, entonces mi resultado debería ser el siguiente:
"instance id","src IP","destination ip","63812","389" is 4 times "instance id","src IP","destination ip","12489","49194" is 2 timesSi yo fuera tú, alteraría la salida en algo como:
1 times : "instance id","src IP","destination ip","63812","389" is 1 times 1 times : "instance id","src IP","destination ip","389","65311" is 1 times 2 times : "instance id","src IP","destination ip","63812","389" is 2 times 1 times : "instance id","src IP","destination ip","88","49169" is 1 times 2 times : "instance id","src IP","destination ip","12489","49194" is 2 times 3 times : "instance id","src IP","destination ip","63812","389" is 3 times 4 times : "instance id","src IP","destination ip","63812","389" is 4 times Y luego agrega | sort -n después de su comando.
(He estado intentando usar sort -kx -n pero la combinación de comillas dobles, comas y espacios estropea el -k del comando sort ).
Usando cualquier sort+awk+head:
$ sort -t, -k5,5 file | awk ' BEGIN { FS=OFS="," } $5 != p5 { if (NR>1) print p0, cnt; p5=$5; p0=$0; cnt=0 } { cnt++ } END { print p0, cnt }' | sort -t, -k6,6rn | head -2 "instance id","src IP","destination ip","63812","389",4 "instance id","src IP","destination ip","12489","49194",2Si no necesita usar awk , la herramienta de línea de comandos GoCSV tiene una serie de subcomandos para obtener los primeros n valores únicos para una columna, ordenados y seleccionados por el recuento de esos valores.
GoCSV espera un encabezado, por lo que para su entrada, el primer paso es agregar algunos nombres de columna predeterminados (que se pueden eliminar más adelante):
gocsv cap -default-name 'Col' input.csvCon un encabezado en su lugar, puede canalizar esa salida a una serie de comandos que:
uniq ) ... \ | gocsv uniq -c 5 -count \ | gocsv sort -c 6 -reverse | gocsv head -n 50Ejecutando todo lo que obtengo:
Col 1,Col 2,Col 3,Col 4,Col 5,Count instance id,src IP,destination ip,63812,389,4 instance id,src IP,destination ip,88,49194,2 instance id,src IP,destination ip,389,65311,1 Para deshacerse del encabezado, simplemente canalícelo en gocsv behead .
Está preconstruido para una serie de plataformas/OS-es .