Как манипулировать двумерным массивом в многомерный массив в «awk»? - PullRequest
0 голосов
/ 08 марта 2019

Я хотел бы преобразовать 2D-массив в многомерный массив с 'awk', например

1 2 3 4 5 6 ...
2 4 5 3 6 7 ...
5 3 2 4 5 1 ...
3 5 2 5 5 1 ...
.
.

в

Array[1]
3 6 ...
2 5 ...
1 4 ...

Array[2]
5 7 ... 
4 6 ...
2 3 ...

.
.
Array[n]

Я пробовал разные способы, но яЯ даже не близко к решению.Посоветуйте, пожалуйста, как этого добиться ...

Далее я начал с 2D-массива и преобразовал его под свои нужды ... как

'BEGIN {
 for (x = 0; ++x <= 5;)
   for (y = 0; ++y <= 5;)
    A[x][y] = "element:" FS x FS y

 for (i in A) {
   split(i, t, SUBSEP)
     print A[t[1], t[2]]
   }
 }'

Но это только для 2D... Тем не менее, я смог улучшить свой ответ, так как в этой публикации с помощью

awk '
{ 
  for (i=1; i<=NF; i++)  {
    a[NR,i] = $i
  } 
}
NF>p { p = NF }
END {    
  for(j=1; j<=p; j++) {
    str=a[1,j]
    for(i=2; i<=NR; i++) {
      str=str" "a[i,j];
    }
    print str
  }
 }' f3a.dat > f4.dat ## Transpose

 # Loop for all columns
 awk '{print $1}' f4.dat > f5.dat ## take out a column prior transformation into array

 awk 'ORS=NR%3?FS:RS' f5.dat > f6.dat ## putting column into  array::3=number of elements in row

 awk '
 { 
   for (i=1; i<=NF; i++)  {
     a[NR,i] = $i
   } 
 }
 NF>p { p = NF }
 END {    
   for(j=1; j<=p; j++) {
     str=a[1,j]
     for(i=2; i<=NR; i++) {
       str=str" "a[i,j];
     }
     print str
   }
  }' f6.dat > f7.dat ## transpose

  tac f7.dat > f8.dat ## reverse line order [UNIX command]

я воспроизводил массив [1], но он неэффективен, поскольку мой реальный массив для преобразования равен [72x100000].

Как преобразовать вышеперечисленное в основной цикл И каждый псевдофайл f8.dat напрямую попадает в многомерный массив?

1 Ответ

0 голосов
/ 13 марта 2019

Не совсем уверен, что вы хотите сделать, но этот скрипт awk выполняет указанное преобразование:

awk -v STEP=3 '
{
    for (i=0; i<NF; i++) {
        x = STEP - i%STEP;
        a[x] = a[x] ? a[x] OFS $(i+1) : $(i+1);
    }
    printf "%sArray[%d]\n", (FNR>1 ? "\n" : ""), FNR;
    for (i=1; i<=STEP; i++) {
        print a[i];
        a[i]="";
    }
}
' <<EOD
1 2 3 4 5 6
2 4 5 3 6 7
5 3 2 4 5 1
3 5 2 5 5 1
EOD

...