Awk'de boşluk veya sekme olan alanlar nasıl ayrılır


51

Oynarken awkyürütmeye geldim:

ls -la >> a.txt ; awk {'print $5  $1'} a.txt ;

Bu gibi çıktı veriyor:

53277-rw-------
52347-rw-------

Bu iki çıktı arkadaşı arasında nasıl boşluk bulabilirim?


1
Bir tavsiye olarak, çıktısını çözümlememelisiniz ls. Bu sizi er ya da geç arkadan ısırır.
gniourf_gniourf

Awk olarak, iki dizgiyi birleştirmek için, yan yana koymanız print $5 $1
yeterlidir


2
@ kenorb ve seçmenleri kapat, bağlantılı kopya hiç bir kopya değil. Alanların öncül ( awk {'print $5 $1'} a.txt) tarafından nasıl yazdırılacağını zaten biliyorlar . Alan # 1 ve alan # 5 arasında nasıl boşluk bırakılacağını soruyorlar.
kos

Yanıtlar:


72

Sadece çizgiyi değiştir

ls -la >> a.txt ; awk {'print $5 "        " $1'} a.txt ;

bu çıktıları boşluklarla basmalıdır.

Bu yardımcı olur umarım.

Düzenle:

McNisse tarafından önerildiği gibi size iyi bir çıktı formatı sağlayacak olan printf kullanabilirsiniz.

ls -la >> a.txt ; awk {'printf ("%5s\t%s\n", $5, $1)'} a.txt ;

4
printfİşlevi numaralarını biçimlendirmek istediğiniz özel olarak ise, daha iyi bir kontrol sağlar. printf("%s\t%s\n", $5, $1)
McNisse

Yukarıdaki cevapta bir yazım hatası var mı? ne anlama 5sgeliyor?awk {'printf ("%5s\t%s\n", $5, $1)'}
Vishal

66

Bir başka awk-özgü teknik, "çıkış alanı ayırıcısını" kullanın

ls -la | awk -v OFS='\t' '{print $5, $1}'

Virgül burada çok önemlidir.


Bu ancak neden çalıştığını $1satır gitmek için
loretoparisi

8

Sekmeleri almanın basit bir yolu:

awk {'print $5"\t"$1'}

5

Bunun eski bir konu olduğunu biliyorum, ama sadece öğreniyorum ve bu yazıları faydalı buldum. En iyi çözüm, sizin için değişkenler arasına boşluk eklemek için gawk kullanmaktı.

ls -la | gawk '{print $1, $9}'

3
-1: Yeni bir şey değil. gawk,, mawkya da başka herhangi biri awk, virgül kullanıyorsanız, bu cevabın söylediği gibi , hepsi boşluk ekler .
muru

1
Olmalı ls -la | awk '{print $1, $9}'. Muru dediği gibi gawkgerekli değil.
Nick Crawford

1

Argümanların arasına boşluk koymak için " ", örneğin ekleyin awk {'print $5" "$1'}.

Ancak edilir değil tavsiye çıkışını ayrıştırmak lskomuta güvenilir değil ve çıkış insanlarda değil, komut için olduğundan,. Bu nedenle findveya gibi alternatif komutlar kullanın stat.

GNU kullanarak örnek İşte stat:

$ stat -t *
001.txt 23 8 81a4 501 20 1000004 242236402 1 0 0 1460260387 1460260239 1460260239 1460260194 4096
7c1c.txt 21 8 81a4 501 20 1000004 242236595 1 0 0 1460261322 1460260486 1460260486 1460260486 4096

size makine dostu çıktı (kısa biçiminde) basar, böylece tam olarak ihtiyacınız olanı elde edebilirsiniz. Sonra kullanmak -cbelirli bir biçim kullanmak veya kullanmaya awk, cutya readsağ sütun alır.

stat --helpDiğer seçenekleri kontrol edin . Örneğin, değişiklik günü yazdırmak için bu örneği kontrol edin .

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.