comm: dosya sıralı değil


10

Kullandığım commiki sıralı dosyaları karşılaştırmak için. Bu dosyalardaki her satır pozitif tam sayıdır. Ama sonuçlar gösteriyor ki

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

Bu iki dosya sıralansa bile hata nasıl gelir?


Benim durumumda küçük harfleri dikkate alan notepad ++ kullanarak dosyaları sıralı (sözlükçik artan) ve büyük harfleri ayrı ayrı örneğin. a 'Z'den sonra artan sırada görünecektir. Bu, sıralama yardımcı programının (bash) nasıl sıralandığından farklıdır. Bunu doğrulamak için tüm satırları büyük harfe dönüştürdüm ve sonra np ++ 'da sıraladım, comm artık şikayet etmedi.
Sahil Singh

Yanıtlar:


11

commsortsayısal sıralama ( sort -n) değil sözlükbilimsel sıralama (düz ) gerektirir . Örneğin, aşağıdaki sıralamayı ister:

1
2000
300

Aşağıdaki sipariş değil:

1
300
2000

Bunu düzeltin ve sorun ortadan kalkmalıdır. Daha ezoterik durumlar için commbireyin yerel farklı olabilir sortyerel ayar, çalıştırmak istediğiniz edebilir sortve commbirlikte LC_COLLATE=Cçevrelerindeki doğal bayt sıralamasını kullanmak.


nasıl sayısal sıralama yapmak?
wenzi


" Lexographic Sipariş sayı dizisidir nerede" dir ARTIRMAK size cevap geriye doğru var seeries- talimatıyla yürütülen içinde: mathworld.wolfram.com/LexicographicOrder.html . Kullanımını karşılaştırmak benim aşağıda cevabım test sonuçlarına bakınız sort ile ve olmadan-n anahtarı ve tek gösteriyor ile-n doğru elde edebilirsiniz anahtarı artan kabullenmeni sipariş kendi cevap verirken gereklidir.
F1Linux

@ F1Linux Ne? commkelimenin tam anlamıyla LC_COLLATEd sipariş gerektirir . Cevabınızdaki hataların test setinizin dışındaki örnekler için tamamen kozmetik olmadığını söylemek yeterli ... hiç kimse pozitif sayısal sıralama istemedi.
Chris Down

@ChrisDown Yanıtladığım cevabınız - az önce düzenlediğinizi görmüyorum ve sadece ŞİMDİ " LC_COLLATE " ifadesinden şuydu: " comm sayısal olarak değil literallexicographic sıralama istiyor. Bunu düzeltin ve sorun ortadan kalkmalı. " Şimdi nerede "LC_COLLATE" hakkında "_Lexographic" türünden çok farklı bir canavar vardı. Gerçekten de, ilk cevabınız NO EXPLPLES ile sadece tek bir satırda o kadar seyrekti ki, bu soruyu kendi cevabımla tekrar ziyaret etmeme neden oldu. "LC_COLLATE" burada belirttiğiniz gibi kesinlikle etkili olduğu için güncellenmiş yanıtınızı destekliyorum.
F1Linux

1

GÜNCEL YANIT:

SORUN:

OP, metin değil dosyalardaki pozitif tamsayıları karşılaştırmak için kullanılırken " dosya sıralı değil " hatası commveriyor . Yani ondalık olmayan sayılarla uğraşıyoruz.

Kısa cevap:

-nAnahtarın, sortsağlanan sonuçları sıralamak için kullanılan komutla kullanımına bağlı olarak, commdöndürülen sonuçların sıralaması commçok farklı olabilir:

Sözlük : -nAnahtarın sıralama ile kullanılması, bir dizi artan sayıdaki "pozitif Tamsayılar" ın sipariş edilmesine neden olacaktır. " Hata " comm`s anahtarı kullanılarak bastırılabilir--nocheck-order

Bayt Sırası : Orada NO kullanımı -n switchile sort. komutun yürütüldüğü ana bilgisayarda ayarlanma LC_COLLATEşekline göre bile değişebilen sıralamayı belirler locale. Bu giriş commvarsayılan olarak beklenir. Hakkında biraz daha fazla bilgiyi LC_COLLATEburada bulabilirsiniz: Reference1 ve Reference2

Hata bir sorun mu var? Bu neyi başarmaya çalıştığınıza bağlıdır. Aşağıdaki örneklerde göreceğiniz gibicomm, dosyaları``switch'' ile veya``switch'' olmadan karşılaştırdıktan sonra,komutlabirlikte kullanılıp kullanılmadığınabağlı olarak yukarıdaki şekilde değişsede aynı sonuçları döndürür. Ben, bir dizide artan "sözlükbilimsel" sıralı sonuç- tercih ederim.sort-n-n switchsort

Eğer Ancak yok "in sonucu lexographic " amacıyla, daha sonra do DEĞİL kullanmak -niçin sağlanan verileri sıralarken anahtarı commkarşılaştırma için.

TEST YAPMAK:

commKomutun sonuçlarını -nanahtarla ve anahtarsız karşılaştırırız. Kusalananda'nın isteği doğrultusunda numune test veri setimin karmaşıklığını arttırdım:

Test Verileri :

dosya1.txt :

40
110000
2200
6
33000

file2.txt :

2200
40
33000
6
440000

Kavşak :

Yalnızca BOTH dosyalarında ortak olan sayıları listele

Anahtarsız -n:

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

2200
33000
40
6

Sonuçlar : Doğru, ancak sıralanmamış bir sırayla döndürüldü

İLE -n Anahtarı:

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

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

Sonuçlar : Doğru, ancak LEXOGRAPHIC sıralama düzeninde döndürüldü . İşlem başarıyla tamamlandı ve anahtar commolmadan kullanmakla aynı sonuçları döndürdü -n, ancak sıralı bir listede.

Fark :

Yalnızca her dosyaya özgü numaraları listeleyin:

Anahtarsız -n:

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

110000
         440000

Sonuçlar : Doğru - bu sayılar gerçekten ilgili dosyalara özeldir.

İLE -n Anahtarı:

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

110000
comm: file 1 is not in sorted order
         440000

Bulgular : olarak doğru, aynı sonuçları commolmadan -nanahtarı karşın bunun dönüşü dosyalar kendileri sıralanır olmamak pozitif tamsayılar sırasına hakkında hatasını.

SÖZLÜK SONUÇLARI İÇİN ÇÖZÜM:

Hata mesajını bastırmak için comm`s --nocheck-orderanahtarını kullanın . Sayıların her dosyada sıralanmadığını bildiğimiz için, tarafından döndürülen sonuçlar comm -ndoğrudur, hata bastırılarak güvenle göz ardı edilebilir:

Kavşak :

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

6
40
2200
33000

Fark :

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

110000
         440000

SONUÇ:

Beslenen pozitif tamsayıların sıralanması döndürüldüğünde " dosya sıralı değil " hatası comm, -nanahtarı kullanılarak döndürülen sonuçların commyanlış olduğu anlamına gelmez . Gerçekten, kullanarak comm -nsıralanmış düzende düzenli bir düzeltme döndürür!

@Dhag sayesinde, @kusalananda @ChrisDown, daha fazla genişletme gerektiren sorunları dile getirdiği için. İşlerimin gözden geçirilmesinden her zaman mutlu oluruz: Daha iyi olmamızın tek yolu, sürekli olarak meslektaşlarımız tarafından zorlanıp zorlanmamızdır.


En çok oy alan cevap, "comm sözlükbilimsel sıralama istiyor" dan bahsediyor, ancak siz sayısal olarak sıralıyorsunuz. Bazı durumlarda düşecek gibi görünüyor.
Mart'ta

1000, 200, 30, 4 gibi sayısal ve sözlükbilimsel olarak
sıralanan

@Kusalananda Güncellenmiş cevabıma çok nazik ve faydalı geri bildirimlerinizi ekledim. En çok geri bildiriminiz için!
F1Linux

@dhag, seninkini ve Kusalanada'nın geri bildirimlerini dahil etmek için cevabımı güncelledi. En çok benim
cevap

1
@JeffSchaller Başlangıçta yanıtladığım cevap, Chris'in yeni değiştirilmiş cevabındaki gibi "LC_COLLATE" değil, "Lexographic" türünden bahsetti. Chris'e doğru cevap verdim ve güncel cevabını iptal ettim. "Lexographic" ve "LC_COLLATE" farklı hayvanlardır. Teşekkürler Jeff-
F1Linux
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.