Benzersiz sıralama: Çıktıyı aynı dosyaya yönlendir


14

Boru çıkışını işlendiği dosyaya kaydetmenin kısa bir yolu var mı? Örneğin, aslında yaptığım şey bu

$ cat filename | sort | uniq > result
$ rm -f filename
$ mv result filename

Sadece bir satırda yapmanın bir yolu olup olmadığını merak ediyordum (& & kullanarak bu komutları eklememek)

Bu yol değil, bir fikir edinmek

$ cat filename | sort | uniq > filename

2
echo $(cat filename | sort | uniq > result) > filenameya da başka birşey ? Sadece geçip, deneyecek zamanım yok.
MrVaykadji

Yanıtlar:


18

Sen kullanabilirsiniz spongegelen moreutils paketinin:

LC_ALL=C sort -u filename | sponge filename

Sıralama yaparken benzersiz hatlar seçeneği uniqolduğunda sort, boruya da ihtiyacınız yoktur -u.

UTF-8 yerel ayarlı GNU sisteminde sort -uveya sort | uniqsize benzersiz satırlar vermediğini, ancak ilkini geçerli yerel ayarda aynı sıralayan satır dizisinden ilk olarak unutmayın.

$ printf '%b\n' '\U2460' '\U2461' | LC_ALL=en_US.utf8 sort | LC_ALL=en_US.utf8 uniq

sadece sana verdim . Yerel ayarın C olarak değiştirilmesi, bayt değerlerine göre sıralama düzenini zorlar:

$ export LC_ALL=C
$ printf '%b\n' '\U2460' '\U2461' | LC_ALL=C sort | LC_ALL=C uniq


12

Sen gibi herhangi bir ekstra komutu gerekmez catve uniqhem de kullanmadan rmkomuta ve mvkaldırma ve dosya adını yeniden adlandırma için komutu. sadece basit komutu kullanın.

sort -u filename -o filename


 -u, --unique
        with -c, check for strict ordering; without -c, output only  the
        first of an equal run

 -o, --output=FILE
        write result to FILE instead of standard output

Nasıl çalışır?

sortkomut dosya adınızı sıralar ve -useçenekle yinelenen satırları kaldırır. sonra -oseçeneği ile çıktı yerinde yöntemi ile aynı dosyaya yazar.


3
sortÇalışırken sistem çökerse, orijinal dosyanızı kaybedersiniz.
cuonglm

@Gnouc Yani, bu şanssızlığın sonu !! : '(
αғsнιη

1
Teşekkürler! bu örnekte, özellikle ´sort´ ile bunu yapmalıyım. Ancak genel bir dava hakkında düşünüyordum. @Gnouc, haha ​​sana olmadıysa düşünmenin bir yolu yok, değil mi?
whitenoisedb

3

Önerilen örneğiniz (aşağıda) aynı anda aynı dosyadan okuyup yazacağınız için çalışmıyor.

$ cat filename | sort | uniq > filename

Bir boru veya yönlendirme ile ilgili fikir, her bir borunun veya yönlendirmenin sol ve sağ tarafındaki komutun aynı anda paralel olarak çalışmasıdır. Sağdaki komut, soldaki komut hala çalışırken, soldaki komuttan kendisine verilen bilgileri işler.

Senaryonuzun çalışması için, dosyaya yazan komut başlamadan önce dosyadan okunan komutun tamamlanması gerekir. Bunun çalışması için önce çıkışı geçici bir konuma yönlendirmeniz gerekir, daha sonra bittikten sonra geçici konumdan tekrar dosyaya gönderin.

Bunu yapmanın daha iyi bir yolu temel olarak eski örneğinizdeki gibidir, burada geçici bir dosyaya yeniden yönlendirir ve ardından dosyayı orijinal olarak yeniden adlandırırsınız (ancak önce dosyayı silmenize gerek yoktur, çünkü taşıma mevcut hedefleri siler) .

$ cat filename | sort | uniq > result
$ mv -f result filename

Ayrıca, verileri bir defada belleğe sığacak kadar küçük olduğunda çalışmak dışında bir dize değişkenine de kaydedebilirsiniz.


Birisi önerilen bir düzenleme ortaya koymak gibi, değiştirebilir cat filename | sortsadece sort filename- catburada gereksizdir.
thomasrutter

Aşağıdaki örneğim bunu yapmanın yolu değildi. Açıklama için teşekkürler. catbu durumda gereksiz olabilir ama yönlendirme kısmına odaklanıyordum.
whitenoisedb

1
Aşağıdaki örneğin neden işe yaramadığını açıklıyordum . İşe yaramadığını bildiğini biliyorum.
thomasrutter

Açıkladığınız için teşekkürler! Aslında gerçekte ne olduğunu bilmiyordum.
whitenoisedb

2

teeKomutu kullanabilirsiniz :

sort -u filename | tee filename > /dev/null

teeKomut standart girdiden okur ve standart çıktıya yazar ve dosyaların.


2
Bu benim için işe yaramıyor.
pjvandehaar


Bu does benim için çalış. örneğin, bir satırı dosyanın altına taşımak için: (cat ~/file | grep -v 3662 ; printentry 3662) | tee ~/file > /dev/nullçalışır. Orijinal yazı gibi, bu sadece > ~/fileolmadan tee. Tee sort -o file, aynı boruya devam etmeden adlandırılan dosyaya yazan şuraya benzer görünüyor .
Joshua Goldberg

Bekle, üzgünüm! Deneysel olarak bu @Steven bağlantıda açıklandığı gibi tahmin edilemez veri kaybedeceğini gördüm. 9 satırda 1..9 numaralı bir dosya oluşturun. Aşağıdakiler birkaç kez çalışacak ve daha sonra zaman zaman tüm verileri dosyadan kaldıracaktır: (cat x | grep -v 7 ; echo 7) | tee x > /dev/null; cat x Geçici dosyayı ve / mvveya belki de @ Steven'ın bağlantısından çözümü öneriyorum .
Joshua Goldberg

@JoshuaGoldberg cevabımı bu sayfada gördün mü?
Steven Penny

0

Vim'i Ex modunda kullanabilirsiniz:

ex -sc 'sort u|x' filename
  1. sort u benzersiz sıralama

  2. x değişiklikler yapıldıysa yaz (varsa) ve çık

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.