У меня есть файл, который похож на это:
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:
, то, чтобы означать наиболее отрицательное число быть на первом положении, в то время как самое положительное, чтобы быть на последней позиции.
Я хотел бы произвести распечатанный тот же путь как мой входной файл (та же структура).
$ 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
Объяснение:
sort -k2,2 -u
: сортирует строки на основе второго столбца и не изменяет порядок их (причина, они - в основном то же значение), и сохраните первый.sort -k4,4n
: отсортируйте численно на основе очков (нет никакой потребности в -r
инвертировать его).С 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
Содействие с дополнительной однострочной командой, которая может легко быть настроена
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