Syntaxisfout in awk als anders

Ik gebruik if else -instructies in awk . Telkens wanneer ik het gebruik krijg ik een syntaxisfout. Kan iemand me vertellen hoe ik dit moet gebruiken? Ik krijg de onderstaande syntaxisfout.

Code:

awk '{ FS = "=" ;if($1 ~ /Hi/) {if (!($1=="Hi")) {print $1;}} else {if($1=="bye") {print $1;}}} else {if(if($1=="good") {print $1;}}} END {print $1}'

Output:

awk: { FS = "=" ;if($1 ~ /Hi/) {if (!($1=="Hi")) {print $1;}} else {if($1=="bye") {print $1;}}} else {if(if($1=="good") {print $1;}}} END {print $1}

awk:                                                                                            ^ syntax error

awk: { FS = "=" ;if($1 ~ /Hi/) {if (!($1=="Hi")) {print $1;}} else {if($1=="bye") {print $1;}}} else {if(if($1=="good") {print $1;}}} END {print $1}

awk:                                                                                                     ^ syntax error

awk: { FS = "=" ;if($1 ~ /Hi/) {if (!($1=="Hi")) {print $1;}} else {if($1=="bye") {print $1;}}} else {if(if($1=="good") {print $1;}}} END {print $1}

awk:                                                                                                                                ^ syntax error
0
De if in de if voorwaarde is verdacht. Is dat wat je wilt?
toegevoegd de auteur Ray Toal, de bron
Ja, tuurlijk . Ik ben de vraag aan het bewerken
toegevoegd de auteur User, de bron
Nee als ik deze awk '{FS = "="; if ($ 1 ~/hi /) {if ($ 1)) {print $ 1;}} else if ($ 1 == "bye") {if ($ 2)) gebruik {print $ 2;}} END {print $ 1} '... dan krijg ik de uitvoer. Maar als ik een ander anders toevoeg als ik op een vergelijkbare manier na het bestaande anders een syntaxisfout krijg
toegevoegd de auteur User, de bron
@JuhanaDank je .. Ik heb het geformatteerd
toegevoegd de auteur User, de bron
Kun je een kort, reproduceerbaar voorbeeld maken en dit hier posten, een SSCCE ?
toegevoegd de auteur user unknown, de bron
Gebruik de juiste codeopmaak. Er is een knop voor in de editor, klik op het oranje vraagteken als je het niet vindt.
toegevoegd de auteur JJJ, de bron

3 antwoord

Het eerste probleem is dat je in je reeks van 3 rechter accolades het hele script hebt voltooid, dus de rest van de regel veroorzaakt een syntaxisfout.

U hebt ook een instructie if in een voorwaarde .

Ik weet niet zeker wat je wilde om te schrijven, maar zoiets zou kunnen zijn wat je dacht:

{ 
    FS = "=";
    if ($1 ~ /Hi/) {
        if (!($1=="Hi")) {print $1;}
    } else if ($1=="bye") {
        print $1;
    } else if ($1=="good") {
        print $1;
    }
} 
END {
    print $1
}

At http://ideone.com/srNzp

2
toegevoegd
Bedankt .. Het werkt ...
toegevoegd de auteur User, de bron

Problemen

There are a lot of things wrong with your code. You have unbalanced braces, poor spacing, and other issues that make debugging hard. Ultimately, you have syntax and quoting Problemen.

Oplossingen

U kunt uw code vereenvoudigen door de toewijzing naar FS buiten uw script te verplaatsen. Dit is veel leesbaarder en minder foutgevoelig. Bijvoorbeeld:

$ echo "foo=bar" | awk -F= '{print $1}'
foo

U kunt uw opdracht ook verplaatsen naar een BEGIN-blok voor de duidelijkheid, tenzij u het tijdens runtime opnieuw toewijst aan iets anders.

BEGIN { FS = "=" }

Wat je ook nog doet, als je je code herleest voor leesbaarheid, heb je een veel eenvoudigere tijd om je script te debuggen.

1
toegevoegd
{if(if($1=="good") {print $1;}}}

is fout. De eerste accolade wordt gesloten bij de tweede sluitbeugel, waarbij slechts een van de ronde beugels is gesloten.

More: if(if seems pretty wrong. It might be healed when followed with other constructs, while in most cases you just use if (a && b)) to combine multiple conditions, or if (a) if (b) c else d.

 {if($1=="good") {print $1;}} 

lijkt hier bedoeld te zijn. Ik zal in een ogenblik proberen meer te vinden.

Ja - er zijn meer ongeëvenaarde beugels. Je zou kunnen overwegen Allman Style-inspringing te gebruiken, om daar controle over te krijgen: een nieuwe regel voor elke {, en daarna een nieuw inspringniveau, totdat de brace gesloten is. Kijken:

awk '{ FS = "=" ;
if($1 ~ /Hi/) 
{
    if (!($1=="Hi")) 
    {
        print $1;
    }
} else 
{
    if($1=="bye") 
    {
        print $1;
    }
}
}//<- doesn't match any open brace
else 
{
    if ($1=="good") 
    {
        print $1;
    }
}
}//<- again
END {print $1}'

Veel editors helpen bij het accentueren van passende accolades als u de cursor naast een van de haakjes plaatst. Je hebt ten minste 2 meer ongeëvenaarde beugels sluiten.

0
toegevoegd
Dankjewel voor je hulp
toegevoegd de auteur User, de bron