AWK: periksa nilai jika ada di bash array

Sep 28 2020

Di awksaya memiliki file yang setiap baris berisi nomor dalam kisaran antara 1..16di lapangan $5. Sebagai contoh:

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

Saya ingin memeriksa nomor di lapangan $5dan mencetak pesan yang terkait dengan nilainya. Sebagai contoh:

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

Saya memiliki kode ini di bawah tetapi agak tidak berguna;

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"}'

sejak saya membuat sebuah array;

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

Saya mencoba menerapkan metode yang ditunjukkan di sini https://stackoverflow.com/a/15394738/14320738 seperti ini tetapi tidak berhasil:

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

Baik perintah array dan awk berada di bawah skrip yang sama. Saya tidak tahu bagaimana melakukannya dengan awk. Pemula di sini,

Terima kasih.

Sunting: Jika ada cara untuk melakukannya dengan metode array di awk saya akan sangat menghargainya.

Sunting 2: Setelah komentar membantu saya sampai pada kesimpulan bahwa array bash tidak dapat dilewatkan ke dalam array awk .

Jawaban

4 RavinderSingh13 Sep 27 2020 at 22:10

IMHO Anda tidak perlu membuat array di sini, Anda cukup menjalankan kondisi awkdan mencetak pernyataan yang sesuai.

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

Gunakan lebih dari dan kurang dari ...

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