Многоуровневая сортировка числовых и строковых значений - PullRequest
0 голосов
/ 18 февраля 2019

Я хочу выполнить многоуровневую сортировку плавающих значений, используя awk для данных, как показано ниже:

store:LA----------------400.68  
----pens----------------200.34  
--------reynolds--------110.34  
--------butterflow------90.00  
--------trimex----------NA  
----copies--------------110.34  
--------classmate-------110.34  
----pencil--------------90.00  
--------HB--------------44.5  
--------classmate-------45.5  

Числовое значение - это количество доступного запаса.

отсортированный результат должен выглядеть следующим образом:

store:LA----------------400.68  
----pencil--------------90.00 
--------HB--------------44.5  
--------classmate-------45.5  
----copies--------------110.34  
--------classmate-------110.34  
----pens----------------200.34  
--------butterflow------90.00  
--------reynolds--------110.34  
--------trimex----------NA  

В порядке возрастания сначала по продукту, а по продукту - по марке со значением NA в последнем.

Я попытался выбрать значения $2 сначала относительно магазина (так как существует несколько магазинов), затем добавив стоимость товара после значения магазина и в последнем значение бренда и сохранил то же самоев массиве.
Это выглядит примерно так:

400.68
400.68:200.34
400.68:200.34:110.34
400.68:200.34:90.00
400.68:200.34:NA

Использование asort для этого массива не приводит к требуемому результату:

{
      match($0, /^ */);
      offset = RLENGTH;
      if (offset == 1) { items[NR] = $2 }
      else if (offset > prev_ofst) { items[NR] = items[NR-1]":"$2 } 

      else if (offset < prev_ofst) {
         prev_item = items[NR-1];
         gsub("(\\:[^:]+\\:[^:]+)$", "", prev_item);
         items[NR] = prev_item":"$2;
      }
      else {
         prev_item = items[NR-1];
         gsub("(\\:[^:]+)$", "", prev_item);
         items[NR] = prev_item" "$2;
      }
      prev_ofst = offset;
      print items[NR];
}

END{
      asort(items);
      for (i = 1; i <= NR; i++) {
          gsub("[^:]+\\:", "", items[i]);
          print items[i];
      }
}

1 Ответ

0 голосов
/ 18 февраля 2019

Непонятно, что означает in product based on the brand with NA value in the last. (сортируете ли вы по марке, у которой нет значения NA в входных данных выборки, или вы сортируете по числу в конце каждой строки, в котором есть значение NA?), но при условии, что у вас есть «карандаш» и «копии» в неправильном порядке в ваших ожидаемых выходных данных, вот один из способов сделать то, что, я думаю, вам может понадобиться с GNU awk (который вы уже используете для asort())для многомерных массивов и sorted_in:

$ cat tst.awk
match($0,/^(-*)([^-]+)(-+)([^-]+)/,a) {
    offset = length(a[1])/4 + 1
    for (i=offset+1; i<=3; i++) {
        tags[i] = ""
    }
    tags[offset] = a[2]
    vals[tags[1]][tags[2]][tags[3]] = $0
}
END {
    PROCINFO["sorted_in"] = "@ind_str_asc"
    for ( tag1 in vals ) {
        for ( tag2 in vals[tag1] ) {
            for ( tag3 in vals[tag1][tag2] ) {
                print vals[tag1][tag2][tag3]
            }
        }
    }
}

$ awk -f tst.awk file
store:LA----------------400.68
----copies--------------110.34
--------classmate-------110.34
----pencil--------------90.00
--------HB--------------44.5
--------classmate-------45.5
----pens----------------200.34
--------butterflow------90.00
--------reynolds--------110.34
--------trimex----------NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...