2017-05-05 1 views
1

Die awk unten funktioniert gut für input1 (wenn alle erforderlichen Feld vorhanden sind und Werte haben). Die Exception fied wird entsprechend den if Aussagen in der awk aktualisiert. Es ist nicht für input2 oder input3 (wo alle erforderlichen Felder vorhanden sind, aber die Werte nicht erwartet werden). Die einzigen zwei Felder, die keinen numerischen Wert in ihnen haben können, sind Barcode2 und Barcode3. Die meiste Zeit werden sie, aber wenn sie nicht anwesend sind, ist das Wort missing der Wert. Meine Frage ist, wenn eines dieser beiden Felder oder eines von ihnen missing ist, dann kann dieses Feld übersprungen oder nicht in den if Anweisungen verwendet werden. Ich bin mir nicht sicher, wie oder wo ich das machen soll. Vielen Dank :).awk Feld basierend auf if-Anweisungen zu aktualisieren, außer wenn Schlüsselwort im Feld ist

Eingangtab-delimited --- Barcode2 und Barcode3 "fehlen"

Barcode1 Barcode2 Barcode3 NoBarcode Exception 
38774136 missing  missing  0.89 

Skript

awk ' 
BEGIN { # Set input and output field separator: 
    FS = OFS = "\t" 
} 

NR == 1 {# Search line 1 of file 
    # Create array to tranlate needed field headers to field numbers: 
    for(i = 1; i <= NF; i++) { 
     f[$i] = i 
    } 
    next 
} 

{ 
    if($f["Barcode1"] < 20000000 || 
     $f["Barcode2"] < 2000000 || 
     $f["Barcode3"] < 2000000) { 
     $f["Exception"] = "Failure due to low barcode reads" 
    } 
    else { 
     $f["Exception"] = "Pass" 
    } 
    print 
} 
' input 

Stromausgang für die Eingabetab-delimited sollte Pass in Ausnahme sein, da die fehlende Felder werden nicht verwendet

Barcode1 Barcode2 Barcode3 NoBarcode Exception 
38774136 missing  missing  0.89  Failure due to low barcode reads 

gewünschten Ausgang für die Eingabetab-delimited Pass in Ausnahme als die fehlenden Felder sollten nicht verwendet werden

Barcode1 Barcode2 Barcode3 NoBarcode Exception 
38774136 missing  missing  0.89  Pass 
+1

Bitte bearbeiten Sie Ihr Q, um Ihren aktuellen Ausgang sowie die erforderliche Ausgabe von Ihren Beispieleingängen anzuzeigen. Verbale Beschreibungen führen fast immer zu "oh, und ich meinte X1, nicht X" Kette von Diskussionen in Kommentaren. Viel Glück. – shellter

+0

Ich habe die aktuelle Ausgabe zum Beitrag hinzugefügt. Vielen Dank :). – Chris

+1

du kommst dahin. Ich sehe 2 Sätze "Stromausgang für Eingang 2/3", ich möchte nicht raten, welches die gewünschte Ausgabe ist. Bitte aktualisiere dein Q. Außerdem scheint es, als ob dein Problem mit '&&' ed konditionaler Logik zusammenhängt, welche Pattern-Matching-Blöcke wie 'NR> 1 {...}' nicht so hilfreich sind. Kennen Sie das allgemeinere Konstrukt, das alle Zeilen verarbeitet, zB.e 'awk -F, {if (cond1 && cond2 && .... || altCond ....) {do square} sonst if (cond7 && cond8) {anderes Zeug}} else {mehr Zeug}} 'Datei'? Viel Glück. – shellter

Antwort

2

sind, sind Sie nur zu fragen, wie nur auf einem Feld einen Vergleich zu tun, wenn es nicht enthält das Wort "fehlt"? Statt:

if ($f["Barcode1"] < 20000000 || 
    $f["Barcode2"] < 2000000 || 
    $f["Barcode3"] < 2000000) 
     $f["Exception"] = "Failure due to low barcode reads" 

dies tun:

if (($f["Barcode1"] != "missing" && $f["Barcode1"] < 20000000) || 
    ($f["Barcode2"] != "missing" && $f["Barcode2"] < 2000000) || 
    ($f["Barcode2"] != "missing" && $f["Barcode3"] < 2000000)) 
     $f["Exception"] = "Failure due to low barcode reads" 

Auch die Verwendung von Leerzeichen und Vertiefung beachten, um Code besser lesbar zu machen!

Ich empfehle Ihnen das Buch Effective awk Programming lesen, 4. Auflage, von Arnold Robbins, da es nicht nur, dass Sie die Sprache awk lehren, sondern mit allgemeinen Programmiergrundlagen wie if, &&, || usw. helfen

Verwandte Themen