Sıralama `sed --in-place 'gibi bir dosyayı yerinde sıralamayı destekliyor mu?


80

Ben kör ya da benzeri hiçbir seçeneği yoktur muyum --in-placeiçin sort?

Sonuçları girdi dosyasına kaydetmek için sed, -i( --in-place) işlevini kullanır .

Çıktısını sortgirdi dosyasına yönlendirmek

sort < f > f

boş hale getirir. Eğer --in-placeseçenek yoksa - belki de bunu kullanışlı bir şekilde nasıl yapacağınıza dair bir numara olabilir.

(Aklıma ilk gelen şey:

sort < f > /tmp/f$$ ; cat /tmp/f$$ > f ; rm /tmp/f$$

Taşınma doğru bir seçim değildir, çünkü dosya izinleri değişebilir. Bu yüzden daha sonra çıkardığım temp dosyasının içeriğiyle üzerine yazıyorum.)


Ayrıca insitu, herhangi bir komutun yerinde kullanılmasına izin vermek de mümkündür.
sr_

@sr_, bu ilginç bir komuttur, ancak herhangi bir komutla çalışmaz , sadece okuduklarından daha hızlı yazmayanlar (aksi takdirde komut okumadan giriş dosyasını kapatır). İşe yarayacağının garantisi yok sort.
cjm

@cjm, gerçekten emin değilim, ama bunun bu davayla başa çıkması gerekmiyor mu?
sr_

@sr_, bence haklısın. Kaynağa bakmak yerine açıklamayı okudum. Her ne kadar gerçekten büyük dosyalar için, arabellek ve kilitlenme için belleği tükenebilir (malloc'dan NULL dönüşünü denetliyor gibi görünmüyor).
Ocak'ta cjm

@cjm: Oh evet, gerçekten.
sr_

Yanıtlar:


110

sortvardır -o, --outputargüman olarak bir dosya adı alır seçeneği. Giriş dosyasıyla aynıysa, sonucu geçici bir dosyaya yazar, ardından orijinal giriş dosyasının üzerine yazar (tam olarak yaptığı ile aynı şey sed -i).

Gönderen GNU sortbilgi sayfasında:

`-o OUTPUT-FILE'
`--output=OUTPUT-FILE'
      Write output to OUTPUT-FILE instead of standard output.  Normally,
      `sort' reads all input before opening OUTPUT-FILE, so you can
      safely sort a file in place by using commands like `sort -o F F'
      and `cat F | sort -o F'.  However, `sort' with `--merge' (`-m')
      can open the output file before reading all input, so a command
      like `cat F | sort -m -o F - G' is not safe as `sort' might start
      writing `F' before `cat' is done reading it.

      On newer systems, `-o' cannot appear after an input file if
      `POSIXLY_CORRECT' is set, e.g., `sort F -o F'.  Portable scripts
      should specify `-o OUTPUT-FILE' before any input files.

ve Açık Grup Bazlı Teknik Özellikler Sayı 7'den :

-o  output
    Specify the name of an output file to be used instead of the standard 
    output. This file can be the same as one of the input files.

Kesinlikle ! İşe yarıyor ! Bunun hakkında hiçbir ipucu göremiyorum man sort- belgelenmemiş özellik mi? Standart ve taşınabilir mi?
Grzegorz Wierzowiecki

@GrzegorzWierzowiecki: güncellemeye bakın.
enzotib

Güzel cevap :).
Grzegorz Wierzowiecki

1
Özetle: sort -o <filename> <filename>bir dosyayı güvenli bir şekilde yerinde sıralayacaktır.
phyatt

11

Bu spongeişlevi önce kullanabilirsiniz, stdinsonra ıslatır ve sonra şöyle bir dosyaya yazar:

sort < f | sponge f

Bunun dezavantajı spongeçıktıyı geçici olarak bellekte saklayacağı ve bu da büyük dosyalar için sorunlu olabilir. Aksi takdirde, önce dosyayı bir dosyaya yazmalı, sonra da orijinal dosyanın üzerine yazmalısınız.

Bununla birlikte, diğer cevaplarla da belirtildiği gibi, yerinde yapılan değişiklikler genel olarak iyi bir fikir değildir, çünkü bir işlemin ortasında (örneğin spongebir tane), makine çökebilir ve ardından hem orijinal hem de yeni dosyayı kaybedebilirsiniz. Önce farklı bir dosyaya yazıp daha sonra bir atomik mv(hareket) komutu kullansanız iyi edersiniz .


7

Girdi dosyası ile çıktı dosyasının üzerine yazılması tehlikelidir, çünkü program veya sistem dosya yazılırken çökerse, ikisini de kaybettiniz.

Birkaç program (çoğunlukla GNU versiyonları) yerinde bir seçeneğe sahiptir (örneğin -i, perl ve GNU sed; -oGNU sıralamada). Verileri geçici bir dosyaya koyarak ve sonra yerine taşıyarak çalışırlar. Böyle seçeneği programlar için Colin Watson'ın spongeyarar (dahil Joey Hess moreutils ) herhangi bir programa (örnekler için güvenle işi yapar: Ben yapabilir miyim cut? Yerinde bir dosyayı değiştirmek ; ben iconv dönüştürülen ile giriş dosyanın yerini nasıl yapabilirim çıktı? ).

Yalnızca orijinal dosyayı aynı izinlerle yeniden oluşturamayacağınız ender durumlarda, dosyanın yerine yazılmasını öneririm. Bu durumda, orijinal girişi bir yere kaydetmeniz daha iyi olur. Ve sonra girişin kopyasını işlemden geçirebilir ve orijinal dosyaya gönderebilirsiniz.

cp -p f ~/f.backup
sort <~/f.backup >|f
rm ~/f.backup # optional

1
sort -oGNU’ya özgü değildir ve özellikle dosyayı yerinde düzenlemek için tasarlanmıştır. sortçıktılarını tam olarak okumadan önce yazmaya başlayamaz (veri depolamak için hafıza veya geçici dosyalar kullanır), bu nedenle girdiyi geçersiz kılması gerektiği için doğal olarak gelir.
Stéphane Chazelas 8:15

Ve aslında, GNU’nun sortPOSIX’in sort -mo file1 file1 file2çalışmadığı garanti edilirken sortPOSIX’in olmadığı bir durum bu.
Stéphane Chazelas,

@JoelCross Odd, sort -obenim için coreutils 8.25 ile çalışır ve mülk kılavuzda belgelenmiştir (birleştirme işlemi sırasında değil, sıralama sırasında sadece durum olduğu dikkate alınarak). Bunu çoğaltabiliyorsanız, bir hata raporu gönderin (tam komut satırını, tam giriş dosyalarını, hangi sistemi çalıştırdığınızı ve ikili dosyayı nasıl aldığınızı gösterir).
Gilles,

4

-oVim-way kullanın veya deneyin:

$ ex -s +'%!sort' -cxa file.txt
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.