rimuove le righe vuote nel display awk


10

Stavo cercando di trovare una soluzione a questa domanda. Volevo usare awkper la soluzione.

Il mio file di input è simile al seguente.

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

Ho usato il awkcomando per estrarre i secondi valori dopo _come sotto.

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

Tuttavia, anche se il comando sopra stampa i valori corretti, sto ottenendo righe vuote nel mio output. Ho 2 domande.

Domanda 1

Come posso rimuovere le righe vuote nell'output in modo da ottenere solo venkate venkat3nell'output?

Se uso printfinvece che printnel mio awk, ottengo venkatvenkat3come output che non volevo ottenere. Voglio l'output come,

venkat
venkat3

Domanda 2

Usando quei valori come un array associativo o qualcosa del genere, come posso sapere se i valori si verificano effettivamente nella $1colonna?

Volevo ottenere qualcosa di simile,

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

MODIFICARE

Non ho notato la awksoluzione di Stephane. Sta facendo la stessa cosa che avevo menzionato?


1
Stephane awknon sta facendo la stessa cosa. Il tuo approccio presuppone che una parola possa essere contenuta in un'altra solo se è separata da _. Sebbene ciò sia vero per l'esempio del PO, tutte le risposte postate trattano anche casi come doglione non solo dog_lion.
terdon

Risposte:


8

Domanda 1

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

Domanda 2

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

Devo visualizzare venkate venkat3secondo il PO fatto nell'altra domanda. Sto cercando di scoprire se la chiave dopo _è presente nella mia $1colonna.
Ramesh,

Oh, ho aggiornato la mia risposta!
cuonglm,

Bella soluzione. Penso che dovresti aggiungere questo anche alla tua soluzione nell'altra domanda :)
Ramesh,

8

per la domanda 1, è possibile utilizzare l' opzione --only-delimited( -s) dicut

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

8

Un altro approccio:

Domanda 1

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

Questo verrà stampato solo se $2definito. È un modo più breve di scrivere:

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

Domanda 2

Non hai nulla da aggiungere che non sia già stato risolto.


1
Buona soluzione per la domanda 1. Breve e nitido :)
Ramesh

6

domanda 1

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

Domanda 2

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

Bella soluzione. Mi piace :)
Ramesh

Per la domanda 2, intendo ottenere solo venkate venkat3come output in quanto sono presenti $1. Tuttavia, ottengo tutti i $1valori secondo il tuo comando.
Ramesh,

@Ramesh: Come da descrizione, penso che tu voglia ottenere la $2voce che si è $2verificata nella prima colonna. È giusto?
cuonglm,

@Gnouc, sì, hai ragione.
Ramesh,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.