Pertanyaan

Saya memiliki larik berikut:

scansum[key,key2]++

key = kelipatan 6 digit angka mis. 123456, 234567, 345678 dll.

key2 = satu jam mis. 00, 01, 02 dst.

Kode sampel

#!/bin/sh

awk '
BEGIN {
        printf ("---------------------------------------\n-----CTS_DR Read Report By Scanner-----\n---------------------------------------\n")
        }
                {
                key = substr ($16,3,6) #Scanner
                key2 = substr ($2,1,3) #Hour
                scanner[key]++
                if ($21 ~ /SR1/) scansum[key,key2]++
                }
END {
                for (scan in scanner) {
                        printf ("\nScanner: MS%6s\tTotal Reads:%8s\n",scan,scanner[scan])
                        for (i = 0; i <= 23; i++) {
                                        if (i < 10)
                                        h = "0" i
                                        else
                                        h = i
                                print "Hour: "h " Count Test: "scansum[scan,h]
                                }
                        }
}'

Saya tahu bahwa untuk array normal Anda bisa melakukan:

for (alias in arrayname) {
print arrayname[alias]
}

Dan ini akan menghitung larik yang dipisah dengan kunci tetapi untuk larik multidimensi, berikut ini sepertinya tidak berfungsi:

for (alias in arrayname) {
  print alias
  for (i = 0; i <= 23; i++) {
      if (i <10)
      h = "0" i
      else
      h = i
  print h"\t"arraynamecount[alias,h]
  }
}

Catatan

Saya tahu bahwa ini tidak memiliki pengaturan array

Saya tahu saya kehilangan sesuatu tetapi saya tidak bisa melihat apa itu seumur hidup saya. Setiap petunjuk/bantuan untuk ini akan sangat dihargai.

0
glly 30 Agustus 2016, 07:45
Dapatkah Anda menggunakan array 2D sejati awk 4.0?
 – 
pakistanprogrammerclub
30 Agustus 2016, 09:16
Untuk array multidimensi, variabel alias Anda berisi nilai string yang cocok dengan format key[SUBSEP]key2 di mana [SUBSEP] mewakili karakter \034. Baca bagian ini tentang array multidimensi awk
 – 
Jdamian
30 Agustus 2016, 10:56
Sayangnya saya tidak dapat menggunakan awk 4.0 array 2D yang sebenarnya karena sistem menjalankan versi lama awk dan bisnis telah memutuskan untuk tidak memutakhirkannya.
 – 
glly
5 September 2016, 15:31

1 menjawab

Jawaban Terbaik

Sebagaimana dijelaskan dalam tautan ini, Anda dapat menggunakan split() berfungsi untuk mendapatkan larik untuk setiap indeks larik multidimensi awk karena setiap indeks formulir

key1,key2,···,keyN

Disimpan sebagai string

key1[SUBSEP]key2[SUBSEP]···[SUBSEP]keyN

Di mana [SUBSEP] adalah singkatan dari karakter ASCII yang ditahan dalam variabel SUBSEP, yang secara default adalah \034. Sebenarnya Anda dapat mengakses elemen array multidimensi apa pun secara alternatif menggunakan string itu:

x=myarray[key1 SUBSEP key2]

Pada dasarnya blok END akan terlihat seperti ini

END {
      for (scan in scansum) {
        split(scan,ind,SUBSEP)
        print "Scanner: " ind[1] "\tHour: " ind[2] "\tCount Test: " scansum[ind[1],ind[2]]
      }
}
1
Jdamian 31 Agustus 2016, 22:17
Hanya untuk tujuan informasi, saya telah menemukan bahwa Anda dapat melakukan Total array multidimensi dengan cara yang sama seperti array kunci tunggal, arrayname[key], tetapi Anda harus memastikan 2 string yang Anda gunakan untuk membandingkan string yang dalam kasus saya adalah jam,00,01,02... etc adalah sama. Saya memiliki substr asli yang menarik karakter tambahan, :, yang menyebabkan larik tidak cocok pada jam yang dikodekan.
 – 
glly
9 September 2016, 06:58