AWK: Überprüfen Sie den Wert, falls er im Bash-Array vorhanden ist

Sep 28 2020

In awkmir eine Datei hat , dass jede Zeile eine Zahl im Bereich zwischen enthält 1..16im Feld $5. Zum Beispiel:

X;X;X;X;1;X;X
X;X;X;X;8;X;X
X;X;X;X;25;X;X
X;X;X;X;5;X;X

Ich möchte die Nummer im Feld überprüfen $5und eine Nachricht zum Wert drucken. Zum Beispiel:

1;in range
8;in range
25;not in range 
5;in range

Ich habe diesen Code unten, aber es ist irgendwie unhandlich;

awk -F";" 'OFS";" {if (($5=="1" || $5=="2" || $5=="3" || $5=="4" || $5=="5" || $5=="6" || $5=="7" || $5=="8" || $5=="9" || $5=="10" || $5=="11" || $5=="12" || $5=="13" || $5=="14" || $5=="15" || $5=="16") && $5!="") print $5 OFS "in range"}
{if (!($5=="1" || $5=="2" || $5=="3" || $5=="4" || $5=="5" || $5=="6" || $5=="7" || $5=="8" || $5=="9" || $5=="10" || $5=="11" || $5=="12" || $5=="13" || $5=="14" || $5=="15" || $5=="16") && $5!="") print $5 OFS "not in range"}'

seit ich ein Array erstellt habe;

arr=(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16)

Ich habe versucht, die hier gezeigten Methoden zu implementieren https://stackoverflow.com/a/15394738/14320738 so aber nicht gelungen:

awk -F";" 'OFS";" {if ($5=="${arr[*]}" && $5!="") print $5 OFS "in range"}
    {if (($5!="${arr[*]}" && $5!="") print $5 OFS "not in range"}'

Sowohl das Array als auch der Befehl awk befinden sich unter demselben Skript. Ich weiß nicht, wie ich es machen soll awk. Neuling hier,

Vielen Dank.

Bearbeiten: Wenn es eine Möglichkeit gibt, mit der Array-Methode in awk zu tun, würde ich das begrüßen.

Edit 2: Nach hilfreichen Kommentaren komme ich zu dem Schluss, dass das Bash-Array nicht an das awk-Array übergeben werden kann .

Antworten

4 RavinderSingh13 Sep 27 2020 at 22:10

IMHO müssen Sie hier kein Array erstellen, Sie können einfach eine Bedingung in ausführen awkund Anweisungen entsprechend drucken.

awk -F';' '{if($5>=1 && $5<=16){print $5"; in range"} else{print $5";not in range"}}' Input_file
3 michjnich Sep 27 2020 at 22:11

Verwenden Sie mehr als und weniger als ...

awk -F";" '{ if ($5 >= 1 && $5 <= 10) print $5, "In range"; else print $5, "Not in range" }' <file>