awk ekranındaki boş satırları kaldır


10

Bu soru için bir çözüm bulmaya çalışıyordum . awkÇözüm için kullanmak istedim .

Giriş dosyam aşağıdaki gibi bir şey.

-bash-3.2$ cat file
ramesh
ramesh_venkat
ramesh3_venkat3
ramesh4
ramesh5
venkat
venkat3
venkat4

awkİkinci değerleri _aşağıdaki gibi ayıklamak için komut kullandım .

awk -F "_" '{print $2}' file

Bununla birlikte, yukarıdaki komut doğru değerleri yazdırsa da, çıktımda boş satırlar alıyorum. 2 sorum var.

Soru 1

Nasıl sadece almak o kadar çıktıda boş satırları kaldırmak venkatve venkat3çıktıda?

Ben kullanırsanız printfyerine printskinTenimde awk, ben olsun venkatvenkat3elde etmek istediği değildir çıktı olarak. Çıktıyı istiyorum,

venkat
venkat3

soru 2

Bu değerleri ilişkilendirilebilir bir dizi veya başka bir şey olarak kullanarak , değerlerin gerçekten $1sütunda olup olmadığını nasıl bulabilirim ?

Gibi bir şey başarmak istedim,

awk -F "_" '$2==1{print $1}' file

DÜZENLE

awkStephane'nin çözümünü fark etmedim . Bahsettiğim ile aynı şeyi yapıyor mu?


1
Stephane awkaynı şeyi yapmıyor. Yaklaşımınız, bir kelimenin yalnızca birbirinden ayrılmış olması durumunda başka bir kelimede bulunabileceğini varsayar _. OP örneği için bu doğru olsa da, gönderilen cevapların tümü doglionsadece gibi değil , aynı zamanda da ele alınmaktadır dog_lion.
terdon

Awk olmayanlar için, bkz. Kabuktaki bir dosyadan boş satırlar nasıl kaldırılır?
kenorb

Yanıtlar:


8

Soru 1

$ awk -F _ 'NF > 1 {print $2}' file
venkat
venkat3

Soru 2

$ awk -F _ '
    NR == FNR {a[$1];next}
    ($2 in a) {print $2}
' file file
venkat
venkat3

Ben ekrana ihtiyaç venkatve venkat3OP gereği diğer soru sordu. Sonra anahtar _benim $1sütununda olup olmadığını bulmaya çalışıyorum .
Ramesh

Cevabımı güncelledim!
cuonglm

Güzel çözüm. Sanırım bunu diğer sorudaki çözümünüze de eklemelisiniz :)
Ramesh

8

Soru 1 için, --only-delimited( -s) seçeneğinicut

cut -s -f2 -d'_' file
venkat
venkat3

8

Başka bir yaklaşım:

Soru 1

awk -F_ '$2{print $2}' file

Bu yalnızca $2tanımlanmışsa yazdırılır . Yazmanın daha kısa bir yoludur:

awk -F_ '{if($2){print $2}}' file

soru 2

Zaten ele alınmamış ekleyecek hiçbir şeyiniz yok.


1
Soru1 için iyi bir çözüm. Kısa ve keskin :)
Ramesh

6

soru 1

awk -F "_" '/_/ {print $2}' file

soru 2

awk -F "_" '{values[$1]=1;}; END {for (val in values) print val;}' file

Güzel çözüm. I like it :)
Ramesh

Soru2 için, sadece venkatve var venkat3oldukları çıktı olarak almak niyetindeyim $1. Ancak, tüm $1değerleri komutunuza göre alıyorum .
Ramesh

@Ramesh: Açıklamanız olarak, 1. sütunda meydana gelen $2girişleri almak istediğinizi düşünüyorum $2. Bu doğru mu?
cuonglm

@Gnouc, evet haklısın.
Ramesh
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.