Gelen bir kelimelik satırları verimli bir şekilde sütunlar üzerinde sıyırma


1

Stdout gibi tek kelimelik bir satır akışını göz önünde bulundurun

$ echo foo bar baz quux xyxxy thud | tr ' ' '\n'
foo
bar
baz
quux
xyxxy
thud

Yeni satırlardan başka boşluk olmadığını göstermek için "tek kelimeli" diyorum. Her seferinde bir satır olmak üzere, satır başına sabit sayıda alan (tek karakter değil) doldurarak verileri "sütunlaştırmak" istiyorum . Küçük miktarlarda veri için, xargs bunu güzelce yapar:

$ echo foo bar baz quux xyxxy thud | tr ' ' '\n' | xargs -n 2
foo bar
baz quux
xyxxy thud

Ancak xargs kullanmak bu yolla yavaştır. İşlenecek yüzlerce gigabayt metnim var, bu yüzden yazma işlemimin 50 MB / sn'ye kadar çıkmasını isterdim, böylece bu donanımın yapabileceğini biliyorum (yukarıdaki xargs büyüklük emirleridir).

Standart araç kutusunda daha iyi bir şey var mı? Gerekirse bir şeyler yazabilirim ama zaten orada olan bir metin filtresi kullanmayı tercih ederim.

Yanıtlar:


0

Gelebildiğim en iyi şey

$ yankı foo bar baz quux xyxxy thud | tr '' '\ n' \
  | perl -lne '$ x. = "$ _"; if (! ($.% 2)) {$ x yazdırın; $ x = "";} END {$ x} ise $ x yazdır
 foo bar
 Baz Quux
 xyxxy thud

ya da tartışmasız daha şık, ancak daha kısa olmasa da

$ yankı foo bar baz quux xyxxy thud bang | tr '' '\ n' \
  | perl -ne chomp; "$ _" yazdır; "\ n" yazdıysa (! ($.% 3)); END {yazdır "\ n"} '
foo bar baz
quux xyxxy thud
patlama

Verimlilik?

$ time perl -e '(fo.10000)' için "foo \ n" yazdırın | xargs -n 3> / dev / null

gerçek 0m1.330'lar
kullanıcı 0m0.500s
Sys 0m0.830s


$ time perl -e (1..10000) 'için' foo \ n 'yaz
  | perl -ne chomp; "$ _" yazdır; "\ n" yazdıysa (! ($.% 3)); END {yazdır "\ n"} '\
  > / dev / null

gerçek 0m0.060s
kullanıcı 0m0.030s
Sys 0m0.030s

Başlangıçta 1000000 kelime denedim ama perl 1,45

(4 GB RAM ile AMD-64 x2 5600+ 2,8 GHz’de Vista-32’nin altındaki andinux’ta yapılan zamanlamalar)


Perl bir liner yaklaşık 20 MB / sn diske yazmaya (donanımım üzerinde) çarpıyor, ancak bunları çalıştırabilmem için yeterli CPU kaldı. Teşekkürler!
phs

0

prçok az underrated. İşte geldiğim şey:

% yankı foo bar baz quux xyxxy thud | tr '' '\ n' | pr -2 -a -s '' -t
foo bar
Baz Quux
xyxxy thud
%

Seçenekler sistemler arasında değişebilir; senin bkz prman sayfası.

Bunun performansını ölçmek için hiçbir girişimde bulunmadım.

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.