Печать, уникальная из того, кто управляет

man signal

Будет показывать Вам отображение между числами сигнала и сигнализировать об именах.

3
08.12.2013, 22:01
3 ответа

Легче просто сделать это с sort:

 who | sort -u -k1,1

-u флаг просит "уникальные" строки (подавите дубликаты). Ключевой флаг (-k) говорит, чтобы только рассмотреть первое слово в каждой строке в целях отсортировать и уникальность.

4
27.01.2020, 21:10

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

who | awk '!x[$1]++'

Команда терпит неудачу:

x[$1] ассоциативный массив в массиве, индекс которого является строкой. Все массивы в AWK ассоциативны. В этом случае индекс в массив является первым полем, "кто" управляет, который является именем пользователя. Если пользователь повторяется, основной цикл увеличивает количество на пользователя путем эффективного выполнения.

Каково значение предыдущего ! знак?

Оператор NOT является исключающим – он исключает имя пользователя, которое уже находится в ассоциативном массиве.

4
27.01.2020, 21:10
  • 1
    Каково значение предыдущего ! знак? Метод № 3 –  mkc 08.12.2013, 23:44
  • 2
    Тот же вопрос благодарит за Ваш ответ и Ваше редактирование. –  Phil_Charly 09.12.2013, 18:33

ответ alexi является, вероятно, тем, который Вы хотите. Это просто, коротко, и работы. Но в интересах показа, что существует много способов освежевать кошку, я хотел бы представить альтернативу:

who | awk '{print $1}' | uniq

Это использует awk для распечатывания только первого маркера от who, имя пользователя, и затем uniq объединить повторенные записи. Существует проблема с этим хотя: uniq только объединяет последовательные повторные условия. На моем ноутбуке я - единственный человек, использующий машину, но если я работаю who -a для показа всех дополнительных вещей, как процессы входа в систему, работающие на всем ttys, не, все экземпляры моего пользователя перечислены прямо друг после друга. Так, список от who потребности, которые будут отсортированы. Если мы добавляем другой канал к команде:

who | sort | awk '{print $1}' | uniq

Это должно добиться цели.

Конечно, в этой точке мы используем четыре программы для достижения того, что alexis уже сделал с два. Кроме того, мы даже не избегаем использования программы sort это alexis используется. Если мы хотим иметь альтернативный метод, который является действительно альтернативой, мы не можем использовать вид. Давайте попытаемся использовать только awk, как исходный плакат, казалось, пытался сделать:

who | awk '
{
   array[$1]=$1
}
END{
   for(i in array) {
      print array[i]
   }
}
'

Этот небольшой awk отрывок помещает все имена пользователей в массив в местоположении, индексированном самим именем пользователя. Это гарантирует, что, если имя пользователя подходит дважды, оно просто перезапишет то же имя пользователя, которое уже было в том месте. Затем это просто распечатывает все записи в массиве, который является уникальным списком всех имен пользователей. Для оставления свободного места, мы могли поместить его на одну строку:

who | awk '{array[$1]=$1} END {for(i in array) {print array[i]}}'

Это становится немного длинным, но это могло использовать еще одну вещь: имена действительно должны быть отсортированы. Давайте выполним массив через вид вставки так, чтобы вывод был немного более предсказуемым:

who | awk '
{
   # Read the usernames into an associative array
   array[$1]=$1
}
END{
   # Put the usernames into an indexed array and note the length
   len = 1
   for(j in array) {
      indexed[len] = array[j]
      ++len
   }

   # Sort the array
   for (i=2; i < len; ++i) {
      for (j=i; indexed[j-1] > indexed[j]; --j) {
            temp = indexed[j]
            indexed[j] = indexed[j-1]
            indexed[j-1] = temp
      }
   }

   # Print the unique usernames in order
   for(i=1; i< len; ++i) {
      print indexed[i]
   }
}
'

Это читает в именах пользователей как прежде, но перед распечатыванием их, мы перемещаем их в индексный массив и сортируем этот индексный массив. Вывод будет только именами пользователей (ни одна из дополнительной информации от who), отсортированный, без дубликатов. Что-то вроде этого:

Betty
John
Ziggy
albert
james
nicola


Теперь, можно высказать мнение, что alexis и Rahul предоставили ответы строки, однако, нет ничего, чтобы мешать Вам писать это на одной строке также:

who | awk '{array[$1]=$1} END {len = 1; for(j in array) {indexed[len] = array[j]; ++len} for (i=2; i < len; ++i) { for (j=i; indexed[j-1] > indexed[j]; --j) {temp = indexed[j]; indexed[j] = indexed[j-1]; indexed[j-1] = temp }} for(i=1; i< len; ++i) {print indexed[i]}}'

Надежда, которая помогает.

2
27.01.2020, 21:10
  • 1
    Большое спасибо за Ваше объяснение это значит много для меня для команды awk, цените что спасибо –  Phil_Charly 09.12.2013, 18:32

Теги

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