comm: il file non è in ordine


9

Ho usato commper confrontare due file ordinati. Ogni riga in questi file sono numeri interi positivi. Ma i risultati mostrano

comm: file 1 is not in sorted order
comm: file 2 is not in sorted order

Come mai l'errore anche se questi due file sono ordinati?


Nel mio caso avevo ordinato (ascendente lessicografico) i file usando notepad ++, che considera le lettere minuscole e maiuscole separate, ad es. a apparirà dopo 'Z' in ordine crescente. Ciò è diverso dal modo in cui ordina l'utilità di ordinamento (bash). Per verificarlo, ho convertito tutte le righe in maiuscolo e poi le ho ordinate in np ++, non mi sono più lamentato.
Sahil Singh,

Risposte:


10

commrichiede ordinamento lessicografico (semplice sort), non ordinamento numerico ( sort -n). Ad esempio, desidera il seguente ordine:

1
2000
300

Non nel seguente ordine:

1
300
2000

Correggere questo e il problema dovrebbe scomparire. Per i casi più esoterici in cui commle impostazioni internazionali possono essere diverse dalle sortimpostazioni locali, è possibile che si desideri eseguire sorte commcon il LC_COLLATE=Cloro ambiente per utilizzare l'ordinamento di byte nativo.


come farlo fare un ordinamento numerico?
venerdì


" Ordinazione Lexografica " è il punto in cui una serie di numeri AUMENTA in una serie ordinata: ce l'hai all'indietro nella tua risposta: mathworld.wolfram.com/LexicographicOrder.html . Si prega di fare riferimento ai risultati dei test della mia risposta di seguito che confrontano l'uso di sort con e senza l' -ninterruttore e dimostrano solo con l' -ninterruttore è possibile ottenere l' ordine crescente corretto che si riconosce è richiesto nella propria risposta.
F1Linux il

@ F1Linux Cosa? commrichiede letteralmente LC_COLLATEordine. Basti dire che gli errori nella tua risposta non sono puramente cosmetici per esempi al di fuori del tuo set di test ... nessuno ha chiesto un ordinamento numerico positivo.
Chris Down,

@ChrisDown La tua risposta a cui ho risposto, non quella che ho appena visto e solo ADESSO menziona " LC_COLLATE " era: " comm vuole un ordinamento letterallexografico, non un ordinamento numerico. Correggi questo e il problema dovrebbe sparire. " Ora dove dentro c'era qualcosa su "LC_COLLATE" che è una bestia molto diversa da quella di "_Lexographic". In effetti, la tua risposta iniziale era così scarsa in una sola riga senza NESSUN ESEMPIO che era ciò che mi ha spinto a rivisitare la domanda con la mia risposta. Sto votando la tua risposta aggiornata perché "LC_COLLATE" è decisamente operativo qui, come hai notato.
F1Linux il

0

RISPOSTA AGGIORNATA:

PROBLEMA:

L'OP sta ricevendo un errore su "il file non è in ordine " quando si utilizza commper confrontare numeri interi positivi nei file, non testo. Quindi abbiamo a che fare con numeri non decimali.

Risposta breve:

A seconda dell'uso -ndell'interruttore con il sortcomando utilizzato per ordinare i risultati forniti comm, l'ordine dei risultati restituiti commpuò essere molto diverso:

Lessico : l'uso -ndell'interruttore con ordinamento comporterà che gli "Integer positivi" vengano ordinati in una serie di numeri crescenti. L '" errore " può essere eliminato usando l comm' interruttore--nocheck-order

Ordine byte : NON è previsto l' uso di -n switchcon sort. LC_COLLATEdetermina l'ordinamento che può anche variare in base al modo in cui localeè impostato sull'host in cui viene eseguito il comando. Questo è l'input commprevisto per impostazione predefinita. Un po 'di più LC_COLLATEè disponibile qui: Reference1 e Reference2

L'errore è un problema? Dipende da cosa stai cercando di ottenere. Come vedrai negli esempi seguenti,commrestituisce gli stessi risultati dopo aver confrontato i file con o senza l' sort opzione `s-n, sebbene il loro ordinamento varierà nel modo sopra a seconda che-n switchsia usato con ilsortcomando. Io stesso, preferisco risultati "lessicali" ordinati - numeri che aumentano in una serie.

Tuttavia, se non si desidera che i risultati siano in ordine " lessicale ", NON utilizzare l' -ninterruttore durante l'ordinamento dei dati forniti commper il confronto.

TEST:

Confronteremo i risultati del commcomando con e senza, l' -ninterruttore. Ho aumentato la complessità del mio set di dati di test dei campioni su richiesta di Kusalananda:

Dati di prova :

file1.txt :

40
110000
2200
6
33000

file2.txt :

2200
40
33000
6
440000

Intersezione :

Elencare solo i numeri comuni a ENTRAMBE i file

Senza -ninterruttore:

comm -12 <(sort file1.txt) <(sort file2.txt)

2200
33000
40
6

Risultati : corretto, ma restituito in un ordine non ordinato

Con -n interruttore:

comm -12 <(sort -n file1.txt) <(sort -n file2.txt)

6
40
2200
33000
comm: file 1 is not in sorted order

Risultati : corretto, ma restituito in un ordine ordinato LEXOGRAFICO . L'operazione è stata completata correttamente e ha restituito gli stessi risultati dell'utilizzo commsenza l' -nopzione, ma in un elenco ordinato.

Differenza :

Elenca solo numeri univoci per ciascun file:

Senza -ninterruttore:

comm -3 <(sort file1.txt) <(sort file2.txt)

110000
         440000

Risultati : corretti: questi numeri sono in effetti esclusivi per ogni rispettivo file.

Con -n interruttore:

comm -3 <(sort -n file1.txt) <(sort -n file2.txt)

110000
comm: file 1 is not in sorted order
         440000

Risultati : corretti, stessi risultati commsenza lo -nswitch, ma restituisce l'errore sull'ordine degli interi positivi che non sono stati ordinati nei file stessi.

SOLUZIONE per RISULTATI LEXOGRAFICI:

Usa l' interruttore comm`s --nocheck-orderper sopprimere il messaggio di errore. Poiché sappiamo che i numeri non sono ordinati in ciascun file ma i risultati restituiti comm -nsono corretti, l'errore può essere tranquillamente ignorato sopprimendolo:

Intersezione :

comm -12 --nocheck-order <(sort -n file1.txt) <(sort -n file2.txt)

6
40
2200
33000

Differenza :

comm -3 --nocheck-order <(sort -n file1.txt) <(sort -n file2.txt)

110000
         440000

CONCLUSIONE:

L'errore "il file non è in ordine " quando viene restituito l'ordinamento di numeri interi positivi alimentati commnon significa che i risultati restituiti utilizzando l' -nopzione con commsiano errati. In effetti, l'utilizzo comm -nrestituisce un ordine corretto in un ordine ordinato!

Grazie a @dhag, @kusalananda @ChrisDown per aver sollevato i problemi che hanno richiesto un'ulteriore espansione. Sono sempre felice di rivedere il mio lavoro: l'unico modo per migliorare è se siamo costantemente spinti e sfidati dai nostri colleghi.


La risposta più votata menziona che "comm vuole un ordinamento lessicografico", eppure sembra che si ordinino numericamente. Sembra che cadrà in alcuni casi.
Dhag, il

Riprova con numeri che si differenziano numericamente e lessicograficamente, come 1000, 200, 30, 4.
Kusalananda

@Kusalananda Ho appena inserito il tuo feedback molto gentile e utile nella mia risposta aggiornata. Più obbligato per il tuo feedback!
F1Linux il

@dhag ha appena aggiornato la mia risposta per incorporare il tuo feedback di Kusalanada. I più obbligati per voi gente che si prende il tempo e gli sforzi per rivedere la mia
risposta

1
@JeffSchaller La risposta a cui inizialmente ho risposto ha fatto menzione dell'ordinamento "Lexografico", non di "LC_COLLATE" come nella risposta appena modificata di Chris. Ho risposto a Chris che è corretto e ho valutato la sua risposta aggiornata. "Lexographic" e "LC_COLLATE" sono bestie diverse. Grazie Jeff-
F1Linux il
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.