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

Вы можете попробовать смонтировать автоматически -смонтированные папки в папку /mnt, например:

sudo sh -c "for dir in $(ls /media/$USER | grep -v floppy); do mkdir -p /mnt/$dir; mount --bind /media/$USER/$dir /mnt/$dir; done"

Или создайте символическую ссылку:

ln -s /media/$USER/drivelabel /mnt/drivelabel
-1
24.03.2021, 13:09
2 ответа

Грязным решением будет:

<infile sort -t, -rk2,2 \
|awk -F, '{ seen[$1]= (seen[$1]==""? "\0":seen[$1] ORS) $0 }
 END{ for (x in seen) print seen[x] }' \
|sort -z -t, -rk2,2 \
|tr -d '\0'

Разрушение:

  • <infile sort -t, -rk2,2
    при этом rобратная сортировка входного файлаinfileпо второму полю (запятая является разделителем )в качестве kполя ey.

  • код awk просто переупорядочивает записи, имеющие одинаковый первый столбец; мы разделяем каждую группу с нулевым символом \0.

  • sort -z -t, -rk2,2
    эта обратная сортировка блоков (, разделенных нулевыми символами; мы сообщаем об этом команде сортировки с-z)во втором поле и полях, разделенных запятыми. пожалуйста, посмотрите приведенный ниже вывод непосредственно перед выполнением этого шага и добавьте cat -A, вы увидите:

    ^@I1, -8$
    I1, -2$
    I1, -1$
    ^@I2, -9$
    I2, -6$
    I2, -4$
    ^@I3, -7$
    I3, -4$
    

    ^@символы представляют собой нулевой символ, то, что sort -zвидит в приведенном выше вводе, выглядит примерно так (я делаю для удобочитаемости и лучшего понимания)

    ^@I1, -8$      I1, -2$      I1, -1$
    ^@I2, -9$      I2, -6$      I2, -4$
    ^@I3, -7$      I3, -4$
    

    Вы поняли, приведенная выше команда сортировки видит вторые поля следующим образом

     -8$      I1
     -9$      I2
     -7$      I3
    

    ... и выполните обратную сортировку для них, и она изменится на следующую:

    ^@I2, -9$      I2, -6$      I2, -4$
    ^@I1, -8$      I1, -2$      I1, -1$
    ^@I3, -7$      I3, -4$
    

    ... и если мы вернем обратно структуру,у нас есть на самом деле это:

    ^@I2, -9$
    I2, -6$
    I2, -4$
    ^@I1, -8$
    I1, -2$
    I1, -1$
    ^@I3, -7$
    I3, -4$
    
  • tr -d '\0'
    и это удаляет добавленные нулевые символы из результата, а окончательный вывод —:

    I2, -9
    I2, -6
    I2, -4
    I1, -8
    I1, -2
    I1, -1
    I3, -7
    I3, -4
    
0
28.04.2021, 22:57

Использование GNUawk:

gawk '
  grp[$1] == "" || $2 < grp[$1] { grp[$1] = $2 }
  { val[$1][$2] }
  END {
    PROCINFO["sorted_in"] = "@val_num_asc"
    for (i in grp) {
      PROCINFO["sorted_in"] = "@ind_num_asc"
      for (j in val[i]) print i,j
    }
  }'./file

Идея:

  • сохранить минимальное значение столбца 2 для каждого отдельного значения столбца 1 в массиве grp
  • сохранить каждую строку в двумерном массиве valдля удобного извлечения значений столбца 2 для каждого отдельного значения столбца 1 (вы также можете использовать val[$1][$2] = $0и print val[i][j]для сохранения исходного интервала данных)
  • используйте PROCINFO["sorted_in"]для обхода массива grpна основе значений его элементов и для обходаval[i](моно -размерного )массива на основе значений его индекса (всегда сортируя в в порядке возрастания ).
    Обратите внимание, что вам может потребоваться определить собственную функцию сортировки, если вы хотите изменить порядок сортировки значений столбца 1, которые имеют такое же минимальное значение столбца 2 (, например. если вы добавили I4, -9к своим демонстрационным данным и хотели, чтобы I4сортировалось перед I2в выходных данных ).

Переносимой альтернативой, основанной на преобразовании Шварца , может быть:

sort -k2,2n./file |
  awk '
    grp[$1] == "" { grp[$1] = $2 }
    { print grp[$1] "," $0 }' |
  sort -t, -k 1,1n -k 2,2 -k 3,3n |
  cut -d, -f2-

где «на группу -» (, т. е. относительно значений столбца 1, )минимальное значение столбца 2 добавляется к каждой строке, что позволяет последующую сортировку на основе группы -минимальное значение (-9, -8, -7), значение столбца 1 (, чтобы линии оставались сгруппированными по нему )и значение столбца 2.
awkпередаются отсортированные данные, чтобы упростить сценарий :для каждой строки минимальное значение для -группы уже известно, когда строка встречается, что устраняет необходимость хранить строки в некоторой структуре и печатать их в виде ENDблок (или дважды обработать файл ).

0
28.04.2021, 22:57

Теги

Похожие вопросы