4 sütunluk büyük bir dosyayla karşılaşıyorum. Sıralanan dosyayı stdout'ta 3. sütuna göre görüntülemek istiyorum:
cat myFile | sort -u -k3
Bu numarayı gerçekleştirmek için yeterli mi?
sort -u -k3 myFile
, hatta
4 sütunluk büyük bir dosyayla karşılaşıyorum. Sıralanan dosyayı stdout'ta 3. sütuna göre görüntülemek istiyorum:
cat myFile | sort -u -k3
Bu numarayı gerçekleştirmek için yeterli mi?
sort -u -k3 myFile
, hatta
Yanıtlar:
sort -k 3,3 myFile
geçerli yerel ayar tarafından tanımlanan sıralama düzenine göre, sütunların boşluk dizileri (POSIX / C yerel ayarındaki ASCII SPC ve TAB karakterleri) ile ayrıldığını varsayarak 3. sütuna göre sıralanmış dosyayı görüntüler .
Baştaki boşlukların sütuna dahil edildiğine dikkat edin (varsayılan ayırıcı boşluksuzdan boşluğa geçiştir), boşlukların göz ardı edilmediği yerlerde boşluklarda fark yaratabilir, -b
yoksaymak için bu seçeneği kullanın önde gelen boşluklar.
Kabuktan tamamen bağımsız olduğuna dikkat edin (tüm kabuklar aynı komut satırını aynı şekilde ayrıştırır, kabuklarda genellikle sort
yerleşik komut yoktur).
-k 3
3. sütunla başlayan satırların (baştaki boşluklar dahil) sıralanmasıdır . C yerel ayarında, boşluk ve sekme karakterleri yazdırılabilir tüm karakterlerin önüne geçtiğinden, genellikle size aynı sonucu verecek -k 3,3
(aynı üçüncü alana sahip satırlar hariç),
-u
Aynı sıralamaya sahip birden fazla sayıda varsa, satırlardan yalnızca birini korumaktır (sıralama anahtarının aynı sıraladığı yer (bu, aynı olmak zorunda değildir ).
cat
con kedi enate komutudur. Burada ona ihtiyacın yok.
Sütunlar başka bir şeyle -t
ayrılırsa, ayırıcıyı belirtme seçeneğine ihtiyacınız vardır .
Verilen örnek dosya a
$ cat a
a c c c
a b ca d
a b c e
a b c d
İle -u -k 3
:
$ echo $LANG
en_GB.UTF-8
$ sort -u -k 3 a
a b ca d
a c c c
a b c d
a b c e
Satır 2 ve 3 aynı üçüncü sütuna sahiptir, ancak burada sıralama anahtarı üçüncü sütundan satır sonuna kadar olduğu için -u
her ikisini de korur. ␠ca␠d
önce sıralar ␠c␠c
çünkü yerimdeki ilk geçişte boşluklar yoksayılır, daha önce cad
sıralar cc
.
$ sort -u -k 3,3 a
a b c d
a b c e
a b ca d
3. sütunun bulunduğu kişiler için sadece bir tanesi tutulur ␠c
. ␠␠c
(2 satır boşluğu) olanın nasıl korunacağına dikkat edin.
$ sort -k 3 a
a b ca d
a c c c
a b c d
a b c e
$ sort -k 3,3 a
a b c d
a c c c
a b c e
a b ca d
Nasıl sırası görün a b c d
ve a c c c
tersine çevrilir. İlk durumda, çünkü daha ␠c␠c
önce sıralar ␠c␠d
, ikinci durumda, sıralama anahtarı aynı ( ␠c
) olduğundan, satırları daha a b c d
önce tam sırayla karşılaştıran son başvuru karşılaştırmasıdır a c c c
.
$ sort -b -k 3,3 a
a b c d
a b c e
a c c c
a b ca d
Boşlukları yoksaydığımızda, ilk 3 satırın sıralama anahtarı aynıdır ( c
), bu nedenle son başvuru yeri karşılaştırmasına göre sıralanırlar.
$ LC_ALL=C sort -k 3 a
a b c e
a c c c
a b c d
a b ca d
$ LC_ALL=C sort -k 3,3 a
a b c e
a b c d
a c c c
a b ca d
C yerel ayarında, orada yalnızca bir geçiş olduğu için ␠␠c
önce ␠c
orada karakterlerin (sonra tek baytların) kod noktası değerine göre (boşluktan daha düşük bir kod noktasına sahip olduğu c
) göre sıralama yaptığı sıralama yapılır .
blank
yerel ayarlara bağlı olarak boşluk ve sekmeye ek olarak başka karakterler de içerebilecek şekilde ayrılmıştır.
3,3
? Neden sadece değil 3
?
Metin dosyasındaki (4. karakter) "sütunu" anlıyorsanız, evet, çözümünüz çalışmalıdır (hatta rasgele erişime sahip bazı hafıza kazandıran sihirlerin gerçekleştirilmesine sort -u -k3 myFile
izin vermek sort
için). Veritabanındaki gibi "sütun" u anlıyorsanız - ardından bir ayırıcı tarafından izlenen bir veri varlığı ve değişken sütun genişliği, örneğin daha büyük bir şeye ihtiyacınız olacaktır;
ls -l |awk '{print $5 " " $0;}'| sort -n | cut -d " " -f 2-
(önemsiz olanlara eşittir, ls -lS
ancak örneğe güzel bir şekilde hizmet eder.)
sort -k 1.3,1.3
. ls -l | sort -k5,5n
boyutuna göre sıralamak için.
awk
Solüsyon kolayca karmaşık sıralama gereksinimlerine uyacak şekilde modifiye needed-- tam olarak ne
sort -g -k column_number
Belirli sütunu kullanarak sayısal karakterleri olan herhangi bir listeyi sıralamak için doğru komuttur
Awk Velor kütüphanesini kullanabilirsiniz :
#!/usr/local/bin/velour -f
{
q[NR] = $3
z[NR] = $0
}
END {
a_sort_by(q, z)
io_puts(q)
}
$ sort -k 1.3,1.3 myfile
Dosyanızda ayırıcı yoksa, dosya dosyanızı üçüncü sütunda sıralar.
$ cat myfile
ax5aa
aa3ya
fg7ds
pp0dd
aa1bb
$ sort -k 1.3,1.3 myfile
pp0dd
aa1bb
aa3ya
ax5aa
fg7ds
sıralama sayfası:
[...] -k, --key = POS1 [, POS2] POS1’de (başlangıç noktası 1) bir anahtar başlatır, POS2’de bitirir (varsayılan satır sonu) [...] POS F [.C] [ OPTS], burada F, alan numarası ve C, alandaki karakter konumu; her ikisi de menşeilidir 1. -t veya -b'nin hiçbiri etkin değilse, bir alandaki karakterler önceki boşlukların başından sayılır. OPTS, bu anahtar için genel sipariş seçeneklerini geçersiz kılan bir veya daha fazla tek harfli sipariş seçeneğidir. Anahtar verilmezse, tüm satırı anahtar olarak kullanın.
--Key = 1.3,1.3 ile, yalnızca bir alanın (tüm satır) olduğunu ve bu alanın üçüncü karakter konumunu karşılaştırdığınızı söylediniz.
sort -u -k3 < myFile
.