awk - matcha reguljärt uttryck, spara/printa värdet i föregående fält/kolumn

Permalänk
Medlem

awk - matcha reguljärt uttryck, spara/printa värdet i föregående fält/kolumn

Jag försöker matcha ett reguljärt uttryck (Mwd) i ett antal textfiler med awk, vill därefter plocka ut ett värde i fältet/kolumnen som föregår Mwd. Just nu plockar jag fält 4, vilket fungerar så länge siffran jag vill ha hamnar i fält 4, vilket den dock inte alltid gör beroende på hur inputfilen är skriven:

if ($5 ~ "Mwd") {print $4 > "burnup.txt"}
}

Istället för $4 vill jag alltså ha "värdet i fältet som kommer innan Mwd".

Ett utdrag ur en fil kan se ut så här:

Tra La La 2000. Mwd 2013-07-01

Ett exempel på när ovanstående kod inte fungerar:

Tra La La La La La 2000. Mwd 2013-07-01

Permalänk
Medlem

Jag insåg när jag skrev ovanstående att det blir ett problem även att matcha Mwd på $5, det fältet kommer ju också att förskjutas.

Man skulle alltså behöva hitta vilket fält Mwd ligger i och sedan plocka värdet innan. Hilfe.

Permalänk
Datavetare

Att verkligen parsa en text, till skillnad från att bara extra information from en text där den information man letar efter har ett väldigt specifikt mönster, är något som lämpar sig illa för regulgära uttryck.

Men i just detta fall verkar mönstret vara så pass specifikt att awk kanske inte en så dum idé.

Om jag förstått det hela rätt vill hitta de rader där Mwd förekommer som ett separat ord. Du vill sedan skriva ut det separat ord/siffra som finns i kolumnen innan.

Ett sätt att göra det om man kan anta att det alltid finns en kolumn innan Mwd kolumnen är detta

/[[:space:]]Mwd[[:space:]]/ { for (i=NF; i>0; i--) if ($i == "Mwd") break; print $(i-1); }

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem
Skrivet av Yoshman:

Att verkligen parsa en text, till skillnad från att bara extra information from en text där den information man letar efter har ett väldigt specifikt mönster, är något som lämpar sig illa för regulgära uttryck.

Men i just detta fall verkar mönstret vara så pass specifikt att awk kanske inte en så dum idé.

Om jag förstått det hela rätt vill hitta de rader där Mwd förekommer som ett separat ord. Du vill sedan skriva ut det separat ord/siffra som finns i kolumnen innan.

Ett sätt att göra det om man kan anta att det alltid finns en kolumn innan Mwd kolumnen är detta

/[[:space:]]Mwd[[:space:]]/ { for (i=NF; i>0; i--) if ($i == "Mwd") break; print $(i-1); }

Funkade bra! (hoppade över [[:space::]] dock)