Ordinamento numerico in un file delimitato da virgole con Unix


8

Ho un file separato da virgole che assomiglia a questo:

100,00869184
6492,8361
1234,31
200,04071

Voglio usare sortper ordinare questo file numericamente solo per la prima colonna .

Risultato desiderato:

100,00869184
200,04071
1234,31
6492,8361

Come posso ottenere questo usando l'ordinamento? Sembra che le virgole vengano trattate come migliaia di separatori anziché delimitatori anche quando li chiamo come tali.

Entrambi sort -t',' -ne sort -t',' -nk1'dammi questo:

1234,31
200,04071
6492,8361
100,00869184

L'ordinamento per impostazione predefinita (nessun parametro) o l'utilizzo sort -t','mi dà questo:

100,00869184
1234,31
200,04071
6492,8361

E l'ordinamento come numero sort -nmi dà questo:

1234,31
200,04071
6492,8361
100,00869184

Come posso usare l'ordinamento per ottenere il risultato desiderato?

Modificato per aggiungere: si tratta di un'operazione una tantum per creare un elenco ordinato di circa 7 milioni di righe, quindi soluzioni alternative o altri metodi non ortodossi sono perfettamente accettabili.


gli esempi che vedo qui sembrano mostrare l' -topzione come avere uno spazio tra il -te il personaggio
SeanC

Primo pensiero: usa il taglio. Seleziona solo una colonna particolare, in base a un determinato separatore. Anche la risposta di "Artem Ice" con tr. Adoro tr. Sono troppo pigro per scrivere e testare questo, però. Saluti!
Vorac,

Risposte:


9

Questa è sicuramente una soluzione sporca, ma ho trovato un modo per farlo grazie al suggerimento di @ slhck sui locali. Se arriva una risposta migliore che sarebbe più utile per gli altri, lo accetterò sicuramente poiché questo funziona praticamente solo per il mio problema specifico.

Ho impostato il locale su Spagnolo (Boliviano) in modo che le virgole fossero trattate come punti decimali, quindi l'ordinamento numerico standard ha fatto il trucco.

$ export LC_NUMERIC="es_BO.utf8"

$ cat test.csv
100,00869184
6492,8361
1234,31
200,04071

$ sort -n test.csv
100,00869184
200,04071
1234,31
6492,8361

Ah vedi, avrei suggerito di usare un locale tedesco o simile. Non riesco a pensare a nient'altro in questo momento senza essere in grado di testarlo o quali strumenti hai a disposizione, poiché questa è una versione Unix piuttosto rara.
slhck,

@slhck Questo sembra essere il punto cruciale della maggior parte dei problemi a cui rimango bloccato in UNIX :) Grazie per il tuo aiuto nel farmi trovare una soluzione, a prescindere.
dpatchery il

6

GNU lo sortfa di default:

$ cat test
100,00869184
6492,8361
1234,31
200,04071

$ gsort -nt',' < test
100,00869184
200,04071
1234,31
6492,8361

Versione:

$ gsort --version
sort (GNU coreutils) 8.19

C'è un avvertimento però: Se il vostro ordinamento non funziona come previsto, allora il vostro localeè probabilmente impostato su qualcosa di diverso rispetto C. Perchè è questo? localedefinisce l'ordinamento e l'interpretazione di lettere, numeri, caratteri decimali ecc.

Per verificare ciò, basta entrare localein un Terminale. È LC_NUMERICimpostato su en_US.UTF-8, forse? Questo spiegherebbe l'ordinamento sbagliato. Riportalo su C:

export LC_NUMERIC=C

Quindi, prova di sortnuovo il tuo comando. Se vuoi impostare il tuo globale localesu C, fallo con:

export LC_ALL=C

Non ho accesso a GNU nel mio ambiente. È qualcosa che potrei facilmente ottenere quindi rimuovere quando ho finito? HMU in chat se qualcuno vuole aiutarmi a fare questo ... Sono piuttosto il principiante UNIX.
dpatchery il

Sono abbastanza sicuro che sia solo un localeproblema. Ma che cosa fa sort --versionper te, in realtà?
slhck,

sort --version mi dà una discussione illegale. --i comandi non hanno funzionato neanche per me in passato. Ho controllato la pagina man e non c'è nessuna versione chiamata esplicitamente, ma elenca "HP-UX 11i versione 2: agosto 2003" se questo aiuta a tutti. Il mio LC_NUMERIC è impostato su "C".
dpatchery il

Le impostazioni locali tedesche, ad esempio, dovrebbero essere utilizzate ,come separatore decimale. Non ho mai usato HP-UX però.
slhck,

1

Prova ad aggiungere l' -gopzione che suppone di eseguire l'ordinamento numerico.

Provare:

sort -t',' -g <whatever>

L' -nordinamento numerico non è ? -g mi dà un'opzione illegale.
dpatchery il

-gè l' general-numeric-sortopzione e dovrebbe effettivamente essere disponibile in qualsiasi versione recente di sort. @dpatchery
slhck,

Questo è nel mio posto di lavoro, quindi quasi sicuramente non ho una versione recente :)
dpatchery

0

Sostituisci il delimitatore:

cat commafile | tr , " " | sort -n 

- dovrebbe aiutarti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.