Bu basit, kısa ve yazması, anlaması ve kontrol etmesi kolaydır ve ben şahsen beğendim:
grep -oE '\S+$' file
grep
Ubuntu'da , -E
veya ile çağrıldığında -P
, bir boşluk karakteri (pratikte genellikle boşluk veya sekme) anlamına gelen ve olmayan bir şey anlamına gelen stenoyu alır . Kullanılması niceleyici ve sonu hattı çapa , desen bir satırın sonunda bir veya daha fazla olmayan boşlukları maçları . Bunun yerine kullanabilirsiniz ; bu durumda anlam aynıdır, ancak farklı bir düzenli ifade motoru kullanılır, bu nedenle farklı performans özelliklerine sahip olabilirler .\s
\S
+
$
\S+$
-P
-E
Bu Avinash Raj'ın yorumlu çözümüyle eşdeğerdir (sadece daha kolay, daha kompakt bir sözdizimiyle):
grep -o '[^[:space:]]\+$' file
Bu yaklaşımlar , sayıdan sonra boşluk bırakılabilirse işe yaramaz . Değiştirilebilirler, böylece yaparlar, ama burada buna girmenin bir anlamı yok. Bazen bir çözümü daha fazla vakada çalışmak için genelleştirmek öğretici olsa da, bunu insanların varsaymaya başladığı kadar sık yapmak pratik değildir, çünkü kişinin genellikle sorunun hangi farklı uyumsuz yollardan hangisinin neye ihtiyacı olabileceğini bilmesinin bir yolu yoktur . genelleştirilmek.
Performans bazen önemli bir husustur. Bu soru, girdinin çok büyük olduğunu ve burada yayınlanan her yöntemin yeterince hızlı olduğunu öngörmemektedir. Ancak, hız isteniyorsa, on milyon satırlık giriş dosyasında küçük bir karşılaştırma:
$ perl -e 'print((<>) x 2000000)' file > bigfile
$ du -sh bigfile
439M bigfile
$ wc -l bigfile
10000000 bigfile
$ TIMEFORMAT=%R
$ time grep -o '[^[:space:]]\+$' bigfile > bigfile.out
819.565
$ time grep -oE '\S+$' bigfile > bigfile.out
816.910
$ time grep -oP '\S+$' bigfile > bigfile.out
67.465
$ time cut -d= -f2 bigfile > bigfile.out
3.902
$ time grep -o '[^[:space:]]\+$' bigfile > bigfile.out
815.183
$ time grep -oE '\S+$' bigfile > bigfile.out
824.546
$ time grep -oP '\S+$' bigfile > bigfile.out
68.692
$ time cut -d= -f2 bigfile > bigfile.out
4.135
Siparişin önemli olması durumunda iki kez koştum (bazen I / O-ağır görevler için olduğu gibi) ve sonuçları çarptırabilecek arka planda başka şeyler yapmayan bir makinem olmadığı için. Bu sonuçlardan, en azından geçici olarak ve kullandığım boyuttaki girdi dosyaları için aşağıdakileri sonuçlandırıyorum:
Vaov! Geçiş -P
( PCRE kullanmak için ) yerine -G
(lehçe belirtilmediğinde varsayılan) veya bir büyüklük sırasına göre daha hızlı -E
yapılır grep
. Bu nedenle, büyük dosyalar için bu komutu kullanmak, yukarıda gösterilen komuttan daha iyi olabilir:
grep -oP '\S+$' file
VAY!! cut
Yöntem αғsнιη cevabı , daha hızlı Yolumdan daha hızlı sürümden daha bir büyüklük sırasına bitti! Pa4080'in karşılaştırmalı değerlendirmesinde de kazanan , bundan daha fazla yöntem içeren ancak daha küçük girdilerle - ve bu yüzden testime dahil etmek için diğer tüm yöntemlerden seçtim. Performans önemliyse veya dosyalar çok büyükse , bence αғsнιη'ın yöntemi kullanılmalıdır.cut -d= -f2 file
cut
Bu aynı zamanda , basit cut
ve paste
yardımcı programların unutulmaması ve belki de uygulanabilir olduğunda tercih edilmesi gerektiğini hatırlatan bir hizmet olarak hizmet eder , buna rağmen daha grep
birinci sınıf çözümler olarak sunulan daha karmaşık araçlar olsa da (kişisel olarak daha alışkın olduğum) kullanarak).
grep -o '[^[:space:]]\+$' file