Cut'u çoklu boşlukla ayırmak için nasıl kullanırım?


23

Bu numunenin son sütununu almak istiyorum:

[  3]  1.0- 2.0 sec  1.00 MBytes  8.39 Mbits/sec
[  3]  2.0- 3.0 sec   768 KBytes  6.29 Mbits/sec
[  3]  3.0- 4.0 sec   512 KBytes  4.19 Mbits/sec
[  3]  4.0- 5.0 sec   256 KBytes  2.10 Mbits/sec
...

Kullanırsam

cut -d\  -f 13

alırım

Mbits/sec
6.29
4.19
2.10

çünkü bazen aralarında ek boşluklar vardır.


Son sütun, Mbits/secistediğin bu mu yoksa son iki sütun mu?
terdon

1
Sadece 2. son sütunu almak istiyorum, sadece sayıları
rubo77

Yanıtlar:


17

Sorunuzu tam anlamıyla cevaplamak için:

sed 's/   */:/g' | cut -d : -f 5

veya

awk -F '  +' '{print $5}'

Ancak, parantez içindeki sayı 10'a ulaştıysa bu işe yaramaz. Vb. Yalnızca sayılarla ilgileniyorsanız, her şeyi kaldırabilirsiniz.

sed 's/[^.0-9][^.0-9]*/:/g' | cut -d : -f 6

Evet, yalnızca sayıları kesin, ancak yalnızca 3. örneğiniz doğru çalışıyor
rubo77 0

@ rubo77 Benim için çalışıyor. İlk iki örnek, tam olarak başlığında ne istiyorsan onu yapar. Yoksa birimi de çıkarmak mı istiyorsun? Bu durumda, | sed 's/ .*//'ilk iki örneğin sonuna ekleyin . Tabi bunu yapmanın başka yolları da var.
Gilles 'SO- kötülük yapmayı bırak'

+yerine biraz daha kısa *: cat test | sed 's / [^. 0-9] \ + /: / g' | kesilmiş -d: -f 6
rubo77

@ rubo77 Eğer sed onu destekliyorsa, o kadar. GNU ve BusyBox tarafından desteklenir, ancak BSD veya Solaris tarafından desteklenmez. POSIX belirtir +ve ?ERE ama yapraklarında \+ve \?BRE tanımlanmamış.
Gilles 'SO- kötülük' dur

22

Ardışık tüm boşlukları tek bir alana dönüştürmek için sıkma seçeneği ( bayrak) trile birlikte komut kullanırsak ve ardından sınırlayıcı olarak boşlukla işlem yaparsak, sayıları taşıyan gerekli sütuna erişebiliriz.-scut

Körüklü kod:

cat file | tr -s ' ' | cut -d ' ' -f 8


4
Bu cevap daha yüksek olmalı; öyle arayla en basit ve en okunabilir çözümü.
Luke Davis

5

Bu komutların tümü boşlukla ayrılmış bir dosyanın son sütununu basacaktır:

  • awk '{print $NF}' file

    içinde awk, NFalan sayısı ve $NFson alandır.

  • perl -lane 'print $F[$#F]' file

    -adiziye boşluk dosyayı böler @F, $#Fdizideki elementlerin sayısı o kadar olan $F[$#F]son elemanıdır. Bu -n, komut satırında verilen dosyayı okumak ve -eher bir satıra iletilen komut dosyasını uygulamak anlamına gelir . -lsadece \nher printifadeye bir newline karakteri ( ) ekler .

  • sed 's/.* //g'

    her şeyi son alana eşleştiren ve yalnızca son sütunu bırakarak silen basit bir düzenli ifade.

  • rev file | cut -d' ' -f 1 | rev

    revçıktısını tersine çevirir, böylece son alan birinci olur, cutyazdırmak ve revmetni normale döndürmek için ayırıcı alan bulunur . Eğer ardışık boşluk varsa, bu işe yaramaz .

Girişinize dayanarak, aslında son sütunu istemediğinizi tahmin ediyorum ama sondan birini ya da ikisini birden son haline getirin. Bu durumda, son 2'yi yazdırmak için bunları kullanın ( 8.39 Mbits/sec):

awk '{print $(NF-1),$NF}' file 
perl -lane 'print "$F[$#F-1] $F[$#F]"' file 
sed 's/.* \(.* .*\)/\1/' file 
rev file | cut -d' ' -f 1,2 | rev

ve bunlar penultimate ( 8.39) işlevini yazdırmak için :

awk '{print $(NF-1)}' file 
perl -lane 'print $F[$#F-1]' file 
sed 's/.* \(.*\) .*/\1/' file 
rev file | cut -d' ' -f 2 | rev

4

cutEl kitabındakilere göre birden fazla boşluk oluşmasını ayıramazsınız :

Çıkış alanları, alan sınırlayıcı karakterinin tek bir oluşumu ile ayrılır.

Metin aynı miktarla ayrılmadıkça veya trfazlalığı kaldırmak için kullanın .

Aksi takdirde awk, sedveya gibi alternatif araçlar kullanın ex.

Örneğin:

ex -s +'%norm $2Bd0' +%p +q! foo.txt

Değiştir +q!ile -cwqyerinde değişiklikleri kaydetmek için.


0

Bunun için perl bir astar kullanın:

perl -lane 'print $F[-2]' input_file

Açıklama:

Seçenek -e, perl yorumlayıcısının bir dosyada değil, satır içi komut dosyasını aramasına neden olur.

Seçenek -n, girişin (bir borudaki dosya veya STDIN) satır satır okunmasına neden olur.

Seçenek -l, satırı okuduktan sonra giriş kayıt ayırıcısını (OS'ye bağlı, varsayılan olarak UNIX'te yeni satır) çıkarır ve sonuna her birine ekler.print

Seçenek -adiziye boşluk ile bölünmüş, her bir giriş hattı neden olur @Fve $F[-2]istediğiniz alandır ucunda, ikinci eleman sayma olup. Ayrıca kullanabilirsiniz $F[$#F-1]nerede, $#Fdizinin son endeksidir @Fbiraz daha az okunabilir.

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.