Ich habe versucht, eine Lösung fürDasawk
Frage. Ich wollte für die Lösung verwenden .
Meine Eingabedatei sieht ungefähr wie folgt aus.
-bash-3.2$ cat file
ramesh
ramesh_venkat
ramesh3_venkat3
ramesh4
ramesh5
venkat
venkat3
venkat4
Ich habe awk
den Befehl verwendet, um die zweiten Werte _
wie unten beschrieben zu extrahieren.
awk -F "_" '{print $2}' file
Obwohl der obige Befehl die korrekten Werte ausgibt, erhalte ich in meiner Ausgabe leere Zeilen. Ich habe zwei Fragen.
Frage 1
Wie kann ich die Leerzeilen in der Ausgabe entfernen, sodass ich in der Ausgabe nur venkat
und erhalte venkat3
?
Wenn ich in meinem printf
anstelle von verwende , erhalte ich als Ausgabe, die nicht das ist, was ich erreichen wollte. Ich möchte die Ausgabe wie folgt:print
awk
venkatvenkat3
venkat
venkat3
Frage 2
Die Verwendung dieser Werte alsassoziatives Arrayoder so, wie kann ich herausfinden, ob die Werte tatsächlich in der $1
Spalte vorkommen?
Ich wollte etwas erreichen wie:
awk -F "_" '$2==1{print $1}' file
BEARBEITEN
Ich habe die Lösung von Stephane nicht bemerkt awk
. Tut sie dasselbe, was ich erwähnt habe?
Antwort1
Ein anderer Ansatz:
Frage 1
awk -F_ '$2{print $2}' file
Dies wird nur gedruckt, wenn $2
definiert ist. Dies ist eine kürzere Schreibweise:
awk -F_ '{if($2){print $2}}' file
Frage 2
Ich habe nichts hinzuzufügen, was nicht bereits angesprochen wurde.
Antwort2
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
Antwort3
Für Frage 1 könnten Sie die Option --only-delimited
( ) verwenden.-s
cut
cut -s -f2 -d'_' file
venkat
venkat3
Antwort4
Frage 1
awk -F "_" '/_/ {print $2}' file
Frage 2
awk -F "_" '{values[$1]=1;}; END {for (val in values) print val;}' file