2016-06-08 3 views
0

Dieser Code funktioniert wie erwartet.awk else if - Best Practice

grep myhost hosts.csv | 
awk -F, '{if ($8 != "") print $8; else if ($7 != "") print $7; else if ($7 == "" && $8 == "") print $0}' 

Ich weiß, es gibt Hunderte von Möglichkeiten, eine Katze zu häuten. Aber ich habe mich nur gefragt, ob dies der beste und effektivste Weg ist, dies zu tun.

+0

codereview.stackexchange.com ist besser geeignet für diese Art von Frage. – chepner

+0

Die Klausel 'else if ($ 7 == "" && $ 8 == "") "sollte einfach als' else 'geschrieben werden; Sie kommen nicht darauf, wenn '$ 8! =" "' oder wenn '$ 7! =" "'. Der '$ 8! =" "' - Test berücksichtigt zwei der vier Fälle, die sich aus den Tests ergeben (es spielt keine Rolle, ob "$ 7" leer ist oder nicht; "$ 8" wird gedruckt, unabhängig davon, ob es nicht leer ist). –

Antwort

3

Ok, können Sie versuchen, diese ?:

awk -F, '/myhost/{print ($8!=""?$8:($7!=""?$7:$0))}' 

ODER

awk -F, '!/myhost/{next} $8!=""{print $8;next} $7!=""{print $7;next} 1' 
+1

Die Ausgabe von 'grep' zu' awk' zu pipern ist ein Anti-Pattern. – chepner

+0

Ja, das stimmt, lass mich es beheben – kcoder24

+1

Ich würde bei Ihrer 2. Lösung bleiben: Klarheit maximieren, "clever" minimieren. Ich würde mehr Leerzeichen für die Lesbarkeit hinzufügen. '!/myhost /' ist das selbe wie '$ 0! ~/myhost /' –

1

FWIW würde ich es schreiben, wie einfach:

awk -F, '/myhost/ {if ($8 != "") $0=$8; else if ($7 != "") $0=$7; print}' hosts.csv 
+0

sehr nett hinzuzufügen .. was, wenn ich mein myhost eine variable $ 1 machen wollte, entferne ich gern das grep. Ich spiele jetzt damit und versuche, den Druck tolower hinzuzufügen – rleon

+0

Wenn Sie richtig verstehen: 'awk -F, -v myhost = '$ 1' '$ 0 ~ myhost {if ...}'' –