Вывод записей с наибольшим количеством баллов

VNC работает на портах 5900 и выше; 5900 за службу, я думаю, тогда 5900+ n для каждого n рабочих столов пользователей.

поэтому, если вы, например, седьмой пользователь и получаете рабочий стол :7 , вам потребуется порт 590 7 в дополнение к 5900, открытому в вашем брандмауэр .

В зависимости от вашего дистрибутива Linux, они иногда управляют только несколькими портами вверх или 5900, ваши 10 -15 клиентов, вероятно, превышают это количество, и ваш брандмауэр может блокировать VNC для этих рабочих столов.

нередкая но не обязательно правильная практика заключается в том, чтобы просто открыть порты 5900 :5999 в вашем брандмауэре, что будет учитывать до 99 пользователей... или отключить брандмауэр, если это приемлемо в вашей локальной сети

3
10.06.2021, 05:48
6 ответов

Что-то вроде:

{
head -n 1 file.txt &&
tail -n+2 file.txt |
sort -t $'\t' -nrk 3 |
awk -F '\t' 's[$2] && s[$2] > $3 { next }{ s[$2] = $3 } 1'
} >outfile.txt
  • head -n1для печати заголовка.

  • tail -n+2, чтобы пропустить заголовок и остаток канала для обработки.

  • sortВыполните числовую обратную сортировку (от большего к меньшему)(-rn). Сортировка по столбцу 3(-k 3)ввода, разделенному вкладками (-t $'\t'-, может быть удалена, если в столбце имени или темы )нет пробелов.

  • awkПечатать строку до тех пор, пока объект не виден, или она равна последней.
    -F '\t'Установить разделитель полей на табуляцию. Может быть удалено, если столбец имени и темы не содержит пробелов.

    • s[$2] && s[$2] > $3 { next }Далее; если s[subject]установлено и больше текущего значения (, наивысший балл ).
    • {s[$2] = 1}установитьs[subject] = score
    • 1печать

Если вас не смущает заголовок в последней строке и вам не нужно учитывать имена или темы с пробелами (как в :их нет )- его можно было бы сократить до:

sort -nrk3 file.txt | awk ' s[$2] && s[$2] > $3{next}{s[$2]=$3}1'
3
28.07.2021, 11:26
awk 'BEGIN{ FS=OFS="\t" }
    NR==1              { print; next }
    max[$2]<$3 || NR==2{ max[$2]=$3; data[$2]=$0; next }
    max[$2]==$3        { data[$2]= data[$2] ORS $0 }

END{ for(x in data) print data[x] }' infile

  • BEGIN{ FS=OFS="\t" }, установите символ табуляции \tв качестве разделителя F поля S для ввода и O вывода F поля ] S сепаратор для выхода.
  • NR==1{ print; next }, выходной заголовок строки -.
  • max[$2]<$3 || NR==2{ max[$2]=$3; data[$2]=$0; next }, обновите и сохраните наивысший балл по каждому предмету, а также сохраните всю строку для этого предмета с наивысшим баллом.
  • max[$2]==$3{ data[$2]= data[$2] ORS $0 }, добавьте те записи с одинаковым наивысшим баллом по каждому одному и тому же предмету.
  • END{ for(x in data) print data[x] }, выполните цикл по массиву данных и распечатайте окончательный результат.
3
28.07.2021, 11:26

Используйте GNU sortдля сортировки и uniqдля выбора только первого для каждого предмета:

sort -t '\t' -r -k 2 -k 3n scores.txt | uniq -f 1 -w 7

-k 2выполняет сортировку по теме (2-е поле )и-k 3nnсортирует по цифрам по счету (3-е поле ). Опция -rменяет порядок сортировки на обратный, так что наивысший результат будет первым.

Теперь uniqудаляет двойные предметы, пропуская первое поле с -f 1и сравнивая только 5, поэтому это не удастся для предметов, которые имеют общие первые 5 символов, таких как HistoryAи HistoryB.

Что касается команды uniqс опцией -f, то первое поле не должно содержать пробелов, иначе будет неверный вывод, так как при этом поле представляет собой набор пробелов (обычно пробелы и/или TAB ), затем не -пустые символы. в некоторых конкретных версиях и только в Debian uniqбыла опция -tдля указания разделителя полей, но теперь она удалена из соображений совместимости.

2
28.07.2021, 11:26

GNU datamashтакже является опцией:

{
  # Print header
  head -n1 scores.txt

  # Group columns by subject,score,remarks
  <scores.txt datamash --header-in -s groupby 2,3,4 collapse 1 |

  # Output maximum score
  datamash -f groupby 1 max 2 |

  # Re-shuffle columns to desired format
  datamash cut 4,1,2,3
} |

# Pretty-print columns
column -s $'\t' -t

Файл теста -с несколькими учащимися с максимальным -баллом:

name    subject score   remarks
john    Math    67  satis
lewis   History 56  poor
sarah   Math    89  good
fiona   Geo     65  satis
fiona   Math    65  satis
george  History 99  very good
carl    History 99  very good

Выход:

name         subject  score  remarks
fiona        Geo      65     satis
george,carl  History  99     very good
sarah        Math     89     good
2
28.07.2021, 11:26
awk 'NR==FNR {if ($3>max[$2]) max[$2]=$3; next} FNR==1||$3==max[$2]' file file

Два прохода по входному файлу. Первый проход отмечает наивысшие баллы, второй печатает строки. Предполагается, что баллы больше нуля.

1
28.07.2021, 11:26
{
  head -n 1 -
  sort -r -k2,2 -k3,3n
} < file |
awk '
  prev != $2 {
    print
    prev = $2
  }
'
name subject score remarks
sarah  Math    89   good
george History 99   very good
fiona  Geo     65   satis
1
28.07.2021, 11:26

Теги

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