Entfernen Sie leere Zeilen in der awk-Anzeige

10

Ich habe versucht, eine Lösung für diese Frage zu finden. Ich wollte awkfür die Lösung verwenden.

Meine Eingabedatei ist ungefähr so ​​wie unten.

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

Ich habe den awkBefehl verwendet, um die zweiten Werte nach _wie folgt zu extrahieren .

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

Obwohl der obige Befehl die korrekten Werte druckt, werden in meiner Ausgabe leere Zeilen angezeigt. Ich habe 2 Fragen.

Frage 1

Wie kann ich die Leerzeilen in der Ausgabe entfernen, damit ich nur venkatund venkat3in der Ausgabe erhalte ?

Wenn ich printfstatt printin meinem verwende awk, bekomme ich venkatvenkat3als Ausgabe, was ich nicht erreichen wollte. Ich möchte die Ausgabe wie,

venkat
venkat3

Frage 2

Wie kann ich anhand dieser Werte als assoziatives Array oder ähnliches feststellen, ob die Werte tatsächlich in der $1Spalte vorkommen?

Ich wollte so etwas erreichen wie:

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

BEARBEITEN

Ich habe die awkLösung von Stephane nicht bemerkt . Tut es dasselbe, was ich erwähnt hatte?

Ramesh
quelle
1
Stephane awkmacht nicht dasselbe. Ihr Ansatz geht davon aus, dass ein Wort nur dann in einem anderen enthalten sein kann, wenn es durch getrennt ist _. Während dies für das Beispiel des OP gilt, befassen sich alle veröffentlichten Antworten auch mit Fällen wie doglionund nicht nur dog_lion.
Terdon
Informationen zu Nicht-AWK finden Sie unter: Entfernen von Leerzeilen aus einer Datei in der Shell.
Kenorb

Antworten:

8

Frage 1

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

Frage 2

$ awk -F _ '
    NR == FNR {a[$1];next}
    ($2 in a) {print $2}
' file file
venkat
venkat3
cuonglm
quelle
Ich muss anzeigen venkatund venkat3gemäß dem OP in der anderen Frage gestellt. Ich versuche herauszufinden, ob der Schlüssel danach _in meiner $1Spalte vorhanden ist.
Ramesh
Oh, ich habe meine Antwort aktualisiert!
Cuonglm
Schöne Lösung. Ich denke, Sie sollten dieses auch zu Ihrer Lösung in der anderen Frage hinzufügen :)
Ramesh
8

Für Frage 1 können Sie die Option --only-delimited( -s) von verwendencut

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

Ein anderer Ansatz:

Frage 1

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

Dies wird nur gedruckt, wenn $2es definiert ist. Es ist eine kürzere Schreibweise:

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

Frage 2

Sie müssen nichts hinzufügen, was noch nicht angesprochen wurde.

terdon
quelle
1
Gute Lösung für Frage1. Kurz und knackig :)
Ramesh
6

Frage 1

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

Frage 2

awk -F "_" '{values[$1]=1;}; END {for (val in values) print val;}' file
Hauke ​​Laging
quelle
Schöne Lösung. Ich mag es :)
Ramesh
Für Frage 2 beabsichtige ich, nur venkatund venkat3als Ausgabe zu erhalten, wie sie in vorhanden sind $1. Ich erhalte jedoch alle $1Werte gemäß Ihrem Befehl.
Ramesh
@Ramesh: Wie Sie beschreiben, möchten Sie einen $2Eintrag erhalten, $2der in der 1. Spalte vorkommt. Ist das richtig?
Cuonglm
@ Gnouc, ja du hast recht.
Ramesh