2014-05-01 6 views
8

Ovunque ho guardato mi ha mostrato metodi per farlo funzionare con file fisici ma, per qualsiasi motivo, non con un array. Preferirei non avere questi dati memorizzati, quindi chiamati da un file e lavorare direttamente con l'array se questo è possibile. Sono bloccato utilizzando PowerShell v2, ma questo dovrebbe essere ancora possibile. Apprezzo qualsiasi aiuto in anticipo.

Ho un array chiamato $net_final che ha i seguenti valori:

63.232.3.102 
63.232.3.102 
64.339.161.5 
64.339.161.5 
64.339.161.5 
64.339.161.5 
64.339.161.5 
64.339.161.5 
19.19.19.19 
19.19.19.19 
19.19.19.19 
19.19.19.19 
19.19.19.19 
19.19.19.19 
19.19.19.19 
63.339.161.7 
63.339.161.7 
63.339.161.7 
63.339.161.7 
63.339.161.7 

Ho quindi effettuare le seguenti operazioni per ottenere una lista di IP che si verificano 5 o più volte in questo array:

($net_final | Group-Object | Where-Object {$_.Count -ge 5} | Format-Table -HideTableHeaders -Property Name | Out-String).Trim()

il che mi fa questa uscita:

64.339.161.5 
19.19.19.19 
63.339.161.7 

Tuttavia non riesco a ottenere la virgola delimitata sulla stessa riga. Creare un elenco delimitato da virgole solo dall'array è abbastanza semplice con cose come $net_final -Join "," e ($net_final | Select-Object -Unique) -Join ",", ma ho bisogno di prendere gli elementi dell'array che si verificano $ N numero di volte.

output previsto:

64.339.161.5,19.19.19.19,63.339.161.7

risposta

29

Qui si va, un bel po 'one-liner per voi:

($net_final|group|?{$_.count -ge 5}|Select -ExpandProperty Name) -join "," 

che sarà in uscita:

64.339.161.5,19.19.19.19,63.339.161.7 
+0

Grazie mille. Funziona come un fascino. Non posso credere di essere così vicino alla risposta e non me ne sono reso conto. Frustrante, ma ancora grazie mille. – beardedeagle

8

I ha avuto problemi con quella soluzione di TheMad Tecnico, ma ha trovato le seguenti opere grandi: $ my_array -join ""

+0

ha funzionato anche per me. Grazie. – Ring

+2

Il problema con questo è che fornirà tutti gli IP uniti da virgole, non solo quelli univoci, e il post originale lo voleva solo dove c'erano 5 o più duplicati che questo non rappresenta per nessuno dei due. Il tuo codice restituisce tutti e 15 gli indirizzi IP uniti con le virgole. – TheMadTechnician

1

Ancora più veloce/più semplice da leggere:

$test = (1,3,7,7,3,2,1) 
$($test | sort -Unique) -join "," 

1,2,3,7

È possibile reindirizzare qualsiasi array in sort con il flag -unique to dedupe; la variabile incartata può quindi essere unita al delimitatore preferito.

+0

Ha lo stesso problema della risposta di mgood1. Raccoglie tutte le voci univoche, in cui il richiedente desiderava solo elementi che si ripetono un certo numero di volte. – TheMadTechnician