hapus garis kosong di tampilan awk

10

Saya mencoba mencari solusi untuk pertanyaan ini . Saya ingin menggunakan awkuntuk solusinya.

File input saya adalah seperti di bawah ini.

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

Saya menggunakan awkperintah untuk mengekstrak nilai kedua setelah _seperti di bawah ini.

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

Namun, meskipun perintah di atas mencetak nilai yang benar, saya mendapatkan garis kosong di output saya. Saya punya 2 pertanyaan.

pertanyaan 1

Bagaimana saya bisa menghapus garis kosong di output sehingga saya hanya mendapatkan venkatdan venkat3di output?

Jika saya menggunakan printfalih-alih printdalam awk, saya mendapatkan venkatvenkat3sebagai output yang tidak ingin saya capai. Saya ingin output seperti,

venkat
venkat3

Pertanyaan 2

Menggunakan nilai-nilai itu sebagai array asosiatif atau sesuatu, bagaimana saya bisa menemukan jika nilai-nilai itu benar-benar muncul di $1kolom?

Saya ingin mencapai sesuatu seperti,

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

EDIT

Saya tidak memperhatikan awksolusi Stephane. Apakah ia melakukan hal yang sama dengan yang saya sebutkan?

Ramesh
sumber
1
Stephane awktidak melakukan hal yang sama. Pendekatan Anda mengasumsikan bahwa sebuah kata hanya dapat dimuat dalam kata lain jika dipisahkan oleh _. Meskipun itu benar untuk contoh OP, semua jawaban yang diposting juga menangani kasus seperti dogliondan tidak hanya dog_lion.
terdon

Jawaban:

8

Pertanyaan 1

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

Pertanyaan2

$ awk -F _ '
    NR == FNR {a[$1];next}
    ($2 in a) {print $2}
' file file
venkat
venkat3
cuonglm
sumber
Saya perlu menampilkan venkatdan venkat3sesuai OP bertanya dalam pertanyaan lain. Saya mencoba mencari apakah kunci setelah _ada di $1kolom saya .
Ramesh
Oh, saya sudah memperbarui jawaban saya!
cuonglm
Solusi yang bagus. Saya pikir Anda harus menambahkan yang ini juga ke solusi Anda di pertanyaan lain :)
Ramesh
8

untuk Pertanyaan 1, Anda dapat menggunakan opsi --only-delimited( -s) daricut

cut -s -f2 -d'_' file
venkat
venkat3
iruvar
sumber
8

Pendekatan lain:

pertanyaan 1

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

Ini hanya akan mencetak jika $2sudah ditentukan. Ini adalah cara penulisan yang lebih pendek:

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

Pertanyaan 2

Tidak perlu menambahkan apa pun yang belum ditangani.

terdon
sumber
1
Solusi yang bagus untuk pertanyaan1. Singkat dan segar :)
Ramesh
6

pertanyaan 1

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

pertanyaan 2

awk -F "_" '{values[$1]=1;}; END {for (val in values) print val;}' file
Hauke ​​Laging
sumber
Solusi yang bagus. Saya suka :)
Ramesh
Untuk pertanyaan2, saya bermaksud untuk mendapatkan hanya venkatdan venkat3sebagai output karena mereka hadir $1. Namun, saya mendapatkan semua $1nilai sesuai perintah Anda.
Ramesh
@ Ramesh: Sebagai uraian Anda, saya pikir Anda ingin mendapatkan $2entri yang telah $2terjadi di kolom 1. Apakah ini benar?
cuonglm
@ Gouc, ya Anda benar.
Ramesh