Сортировка значений и захват лучшего счета (самое большое количество)

У меня есть файл, который похож на это:

    7  C00000002 score:  -41.156 nathvy =  49 nconfs =         2251
    8  C00000002 score:  -39.520 nathvy =  49 nconfs =         3129
    9  C00000004 score:  -38.928 nathvy =  24 nconfs =          150
   10  C00000002 score:  -38.454 nathvy =  49 nconfs =         9473
   11  C00000004 score:  -37.704 nathvy =  24 nconfs =          156
   12  C00000001 score:  -37.558 nathvy =  41 nconfs =           51
    2  C00000002 score:  -48.649 nathvy =  49 nconfs =         3878
    3  C00000001 score:  -44.988 nathvy =  41 nconfs =         1988
    4  C00000002 score:  -42.674 nathvy =  49 nconfs =         6740
    5  C00000002 score:  -42.453 nathvy =  49 nconfs =         4553
    6  C00000002 score:  -41.829 nathvy =  49 nconfs =         7559

Мой второй столбец является некоторыми идентификаторами, которые не отсортированы здесь, некоторые из них повторяются, такой как (C00000001) например. У всех них есть различный номер, присвоенный сопровождаемый счетом: (число чаще всего запускается с -).

То, что я хотел бы сделать:

1) прочитайте второй столбец (не отсортированные идентификаторы) и всегда выбирать первый, который появляется. Таким образом в случае C00000001 это выбрало бы на с score : -37.558.

2) теперь, когда мне представили уникальные значения, я хотел бы отсортировать их на основе числа после score:, то, чтобы означать наиболее отрицательное число быть на первом положении, в то время как самое положительное, чтобы быть на последней позиции.

Я хотел бы произвести распечатанный тот же путь как мой входной файл (та же структура).

4
задан 4 September 2018 в 09:03

3 ответа

$ sort -k2,2 -u < filename | sort -k4,4n

7  C00000002 score:  -41.156 nathvy =  49 nconfs =         2251
9  C00000004 score:  -38.928 nathvy =  24 nconfs =          150
12 C00000001 score:  -37.558 nathvy =  41 nconfs =           51

Объяснение:

  1. sort -k2,2 -u: сортирует строки на основе второго столбца и не изменяет порядок их (причина, они - в основном то же значение), и сохраните первый.
  2. sort -k4,4n: отсортируйте численно на основе очков (нет никакой потребности в -r инвертировать его).
8
ответ дан 1 December 2019 в 09:02

С GNU awk> 4.0:

$ gawk '
    !seen[$2] {seen[$2] = $0} 
    END {PROCINFO["sorted_in"] = "@val_num_asc"; for (i in seen) print seen[i]}
  ' file
    7  C00000002 score:  -41.156 nathvy =  49 nconfs =         2251
    9  C00000004 score:  -38.928 nathvy =  24 nconfs =          150
   12  C00000001 score:  -37.558 nathvy =  41 nconfs =           51
1
ответ дан 1 December 2019 в 09:02

Содействие с дополнительной однострочной командой, которая может легко быть настроена

for row in $(cat tmp |  awk '{print $2}' | sort | uniq); do cat tmp | grep $row | head -n 1; done | sort -r --key=4

7  C00000002 score:  -41.156 nathvy =  49 nconfs =         2251
9  C00000004 score:  -38.928 nathvy =  24 nconfs =          150
12  C00000001 score:  -37.558 nathvy =  41 nconfs =           51
0
ответ дан 1 December 2019 в 09:02

Другие вопросы по тегам:

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