supprimer les lignes vides dans l'affichage awk

10

J'essayais de trouver une solution à cette question. Je voulais utiliser awkpour la solution.

Mon fichier d'entrée est quelque chose comme ci-dessous.

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

J'ai utilisé la awkcommande pour extraire les secondes valeurs _comme ci-dessous.

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

Cependant, bien que la commande ci-dessus imprime les valeurs correctes, j'obtiens des lignes vides dans ma sortie. J'ai 2 questions.

question 1

Comment puis - je supprimer les lignes vides dans la sortie de sorte que je ne reçois que venkatet venkat3dans la sortie?

Si j'utilise printfau lieu de printdans mon awk, j'obtiens venkatvenkat3en sortie ce qui n'est pas ce que je voulais réaliser. Je veux la sortie comme,

venkat
venkat3

question 2

En utilisant ces valeurs comme un tableau associatif ou quelque chose, comment puis-je trouver si les valeurs se produisent réellement dans la $1colonne?

Je voulais réaliser quelque chose comme,

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

ÉDITER

Je n'ai pas remarqué la awksolution de Stéphane. Est-ce que ça fait la même chose que j'avais mentionnée?

Ramesh
la source
1
Stéphane awkne fait pas la même chose. Votre approche suppose qu'un mot ne peut être contenu dans un autre que s'il est séparé par _. Bien que cela soit vrai pour l'exemple du PO, toutes les réponses publiées concernent également des cas comme doglionet pas seulement dog_lion.
terdon

Réponses:

8

Question 1

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

Question 2

$ awk -F _ '
    NR == FNR {a[$1];next}
    ($2 in a) {print $2}
' file file
venkat
venkat3
cuonglm
la source
Je dois afficher venkatet venkat3selon l'OP demandé dans l'autre question. J'essaie de trouver si la clé après _est présente dans ma $1colonne.
Ramesh
Oh, j'ai mis à jour ma réponse!
cuonglm
Belle solution. Je pense que vous devriez ajouter celui-ci également à votre solution dans l'autre question :)
Ramesh
8

pour la question 1, vous pouvez utiliser l' option --only-delimited( -s) decut

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

Une autre approche:

question 1

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

Cela ne s'imprimera que si $2est défini. C'est une façon plus courte d'écrire:

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

question 2

Je n'ai rien à ajouter qui n'ait déjà été traité.

terdon
la source
1
Bonne solution pour la question 1. Court et net :)
Ramesh
6

question 1

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

question 2

awk -F "_" '{values[$1]=1;}; END {for (val in values) print val;}' file
Hauke ​​Laging
la source
Belle solution. J'aime ça :)
Ramesh
Pour la question 2, j'ai l'intention d'obtenir uniquement venkatet venkat3en sortie autant qu'ils sont présents $1. Cependant, j'obtiens toutes les $1valeurs selon votre commande.
Ramesh
@Ramesh: Comme votre description, je pense que vous voulez obtenir $2des entrées qui se $2produisent dans la 1ère colonne. Est-ce correct?
cuonglm
@Gnouc, oui, vous avez raison.
Ramesh