usuń puste linie z wyświetlacza awk

10

Próbowałem znaleźć rozwiązanie tego pytania. Chciałem użyć awkrozwiązania.

Mój plik wejściowy jest podobny do poniższego.

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

Użyłem awkpolecenia, aby wyodrębnić drugie wartości po, _jak poniżej.

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

Jednak pomimo tego, że powyższe polecenie wypisuje prawidłowe wartości, otrzymuję puste wiersze na moim wydruku. Mam 2 pytania

Pytanie 1

Jak mogę usunąć puste linie na wyjściu, aby uzyskać tylko venkati venkat3na wyjściu?

Jeśli użyję printfzamiast printw moim awk, otrzymam venkatvenkat3jako wynik, czego nie chciałem osiągnąć. Chcę wynik jak

venkat
venkat3

pytanie 2

Używając tych wartości jako tablicy asocjacyjnej lub czegoś takiego, jak mogę sprawdzić, czy wartości faktycznie występują w $1kolumnie?

Chciałem osiągnąć coś takiego,

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

EDYTOWAĆ

Nie zauważyłem awkrozwiązania Stephane. Czy robi to samo, o czym wspomniałem?

Ramesh
źródło
1
Stephane's awknie robi tego samego. Twoje podejście zakłada, że ​​słowo może być zawarte w innym, tylko jeśli jest oddzielone _. Chociaż dotyczy to przykładu PO, wszystkie opublikowane odpowiedzi dotyczą również przypadków podobnych doglioni nie tylko dog_lion.
terdon

Odpowiedzi:

8

Pytanie 1

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

Pytanie 2

$ awk -F _ '
    NR == FNR {a[$1];next}
    ($2 in a) {print $2}
' file file
venkat
venkat3
Cuonglm
źródło
Muszę wyświetlić venkati venkat3zgodnie z OP zadanym w drugim pytaniu. Próbuję sprawdzić, czy klucz po _jest obecny w mojej $1kolumnie.
Ramesh
Och, zaktualizowałem swoją odpowiedź!
cuonglm
Niezłe rozwiązanie. Myślę, że powinieneś dodać to również do swojego rozwiązania w drugim pytaniu :)
Ramesh
8

w przypadku pytania 1 można użyć opcji --only-delimited( -s) zcut

cut -s -f2 -d'_' file
venkat
venkat3
iruvar
źródło
8

Inne podejście:

Pytanie 1

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

Zostanie wydrukowany tylko, jeśli $2jest zdefiniowany. Jest to krótszy sposób pisania:

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

pytanie 2

Nie dodawaj niczego, co nie zostało jeszcze rozwiązane.

terdon
źródło
1
Dobre rozwiązanie dla pytania 1. Krótki i rześki :)
Ramesh
6

Pytanie 1

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

pytanie 2

awk -F "_" '{values[$1]=1;}; END {for (val in values) print val;}' file
Hauke ​​Laging
źródło
Niezłe rozwiązanie. Podoba mi się :)
Ramesh
W przypadku pytania 2 zamierzam uzyskać tylko venkati venkat3tyle, ile są obecne $1. Jednak otrzymuję wszystkie $1wartości zgodnie z twoim poleceniem.
Ramesh
@Ramesh: Według twojego opisu, myślę, że chcesz uzyskać $2wpis, który $2występuje w 1. kolumnie. Czy to jest poprawne?
cuonglm
@Gnouc, tak masz rację.
Ramesh