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.