Dosya yerinde nasıl sıralanır?


206

sort fileKomutu kullandığımızda , dosya içeriğini sıralı bir şekilde gösterir.


Lütfen dosyayı sıralamanın sonucunda ne yapmak istediğinizi açık bir şekilde açıklamak için sorunuzu güncelleyin. Sıralanmamış içeriğini fileaynı dosyanın sıralı içeriği ile değiştirerek yerine sıralamak ister misiniz ? Sorunuzun şu anda belirtildiği şekilde, hiçbir şey yapmamak doğru bir cevaptır (herhangi bir çıktı istemezsiniz, bu yüzden hiçbir şey yapmayın).
Keith Thompson

@ KeithThompson endişeniz için teşekkürler aslında, bir dosyayı sıralamaya çalışıyordum ama ekrandaki çıktıdan kaçınmak istiyorum.
Ali Sajid

Peki çıktının nereye gitmesini istiyorsunuz? Yeni bir dosyaya mı? Orijinal dosyaya? Koridordaki yazıcıya mı?
Keith Thompson

1
Orignal dosyaya
Ali Sajid

çalıştırın sort infile >outfileve sıralı çıktı "outfile" dosyasına alırsınız. Sonra orijinal "infile" silebilir ve her şey yoluna girecek.
Luis Colorado

Yanıtlar:


415

Sıralanan çıktıyı yeniden yönlendirmek için dosya yeniden yönlendirmeyi kullanabilirsiniz:

sort input-file > output_file

Yoksa kullanabilirsiniz -o, --output=FILEtür seçenek aynı giriş ve çıkış dosyası belirtmek için:

sort -o file file

Not: Yaygın bir hata, çıktıyı aynı giriş dosyasına (örneğin sort file > file) yönlendirmeye çalışmaktır . Kabuk yeniden yönlendirmeleri ( sıralama (1) programını değil) ve girdi dosyası (çıktı olarak da) sıralama (1) programına okuma fırsatı vermeden hemen önce silineceğinden bu çalışmaz .


91
Ortak bir yanlışa İyi not
Drakes

1
LaTeX, +1
Bryson S.

6
Sadece düzenin öneminden bahsetmek. Gönderen GNU sortbilgi sayfasında: -o OUTPUT-FILE' ÇIKIŞ-FILE yerine standart çıkışa --output = ÇIKIŞ-DOSYA' Yaz çıkışı. Daha yeni sistemlerde, herhangi bir girdi dosyasından önce -o' cannot appear after an input file if POSIXLY_CORRECT 'ayarlanır, örn., sort F -o F'. Portable scripts should specify -O OUTPUT-FILE'.
Yassine ElBadaoui

14
Dosya sort -o file{,}
adının

65

sortKomut varsayılan olarak standart çıkışa sıralama işleminin sonucunu yazdırır. "Yerinde" bir sıralama elde etmek için şunları yapabilirsiniz:

sort -o file file

Bu file, sıralı çıktı ile girdinin üzerine yazar . -oBir çıkış belirtmek için kullanılan anahtar, POSIX tarafından tanımlanmıştır böylece tüm sürümünde mevcut olmalıdır, sort:

-o Standart çıktı yerine kullanılacak çıktı dosyasının adını belirtin. Bu dosya giriş dosyalarından biriyle aynı olabilir.

Eğer bir sürümünü olması talihsiz yeterince iseniz sortolmadan -o(anahtar Luis onların var olduğunu bana garanti), standart bir şekilde bir "yerinde" düzenlemeyi elde edebilirsiniz:

sort file > tmp && mv tmp file

2
+ ^ en iyi yanıt için ve belirsiz soru ile, ama yine de üst sayfa sıralamasında bu yüzden artırılması gerekiyor.
u2n

6
sort file | sponge file

Bu aşağıdaki Fedora paketindedir:

moreutils : Additional unix utilities
Repo        : fedora
Matched from:
Filename    : /usr/bin/sponge

1
Bu, kurulumdan sonra Ubuntu üzerinde de çalışırsudo apt install moreutils
Serge Stroobandt

4

Dosyayı yerinde sıralamak için şunu deneyin:

echo "$(sort your_file)" > your_file

Diğer yanıtlarda açıklandığı gibi, çıktıyı doğrudan giriş dosyasına yönlendiremezsiniz. Ancak önce sortkomutu değerlendirebilir ve ardından orijinal dosyaya yeniden yönlendirebilirsiniz. Bu şekilde yerinde sıralama uygulayabilirsiniz.

Benzer şekilde, bu hileyi pastesatır bazında ekleme uygulamak gibi diğer komutlara da uygulayabilirsiniz .


1
Bu kötüdür, çünkü büyük dosyalar için çalışmaz, yeni satırlarla biten şeritler, echo-o
POSIX'teki

4

İşte (ab) 'nin kullandığı bir yaklaşım vim:

vim -c :sort -c :wq -E -s "${filename}"

Bölüm -c :sort -c :wq, dosya açıldıktan sonra vim komutlarını çağırır. -Eve -svim'in terminale çekmeyen bir "başsız" modda çalışması için gereklidir.

Bunun, sort -o "${filename}" "${filename}"dosya adı argümanını yalnızca bir kez alması dışında , yaklaşım üzerinde neredeyse hiçbir faydası yoktur .


Bu, dosyalar için formatterbir nanorcgirişe bir yönerge uygulamak için benim için yararlı oldu .gitignore. İşte bunun için kullandım:

syntax "gitignore" "\.gitignore$"

formatter vim -c :sort -c :wq -E -s

4
Sen vim nanorcmi kullanıyorsun ? Ah ironi.
Brett Holman

2

Bir klasördeki ve alt klasördeki tüm dosyaları geçersiz kılmak üzere sıralamak ister misiniz?

Bunu kullan:

find . -type f -exec sort {} -o {} \;
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.