Удаление дубликатов на переменной без сортировки

Ну, после поиска вокруг и чинить различные точки со всего StackOverflow (Ну и дела, я уже люблю это место), большинство проблем уже прошло этот этап. Мне действительно удавалось разработать ответ на мою проблему все же.

, Как создать ресурс:

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

  • Щелчок правой кнопкой проект Вы хотите добавить ресурс к. Сделайте это в Проводнике Решения. Выберите опцию "Properties" из списка.
  • Щелчок вкладка "Resources".
  • первая кнопка вдоль вершины панели позволит Вам выбрать тип ресурса, который Вы хотите добавить. Это должно запуститься на строке. Мы хотим добавить значок, поэтому нажмите на него и выберите "Значки" из списка опций.
  • Затем, перемещение к второй кнопке, "Добавляют Ресурс". Можно или добавить новый ресурс, или если Вам уже сделали значок уже, можно добавить это также. Следуйте за подсказками для того, какой бы ни опция Вы выбираете.
  • На данном этапе можно дважды щелкнуть по недавно добавленному ресурсу для редактирования его. Примечание, ресурсы также обнаруживаются в Проводнике Решения, и дважды щелкающий там является столь же эффективным.

, Как использовать ресурс:

Большой, таким образом, у нас есть наш новый ресурс и мы жаждем иметь те прекрасные изменяющиеся значки... Как мы делаем это? Ну, удачный нас, C# делает это чрезвычайно легким.

существует статический класс, названный Properties.Resources, который предоставляет Вам доступ ко всем Вашим ресурсам, таким образом, мой код закончил тем, что был так же прост как:

paused = !paused;
if (paused)
    notifyIcon.Icon = Properties.Resources.RedIcon;
else
    notifyIcon.Icon = Properties.Resources.GreenIcon;

Сделанный! Законченный! Все просто, когда Вы знаете как, не так ли?

7
задан user224178 9 December 2009 в 09:38
поделиться

6 ответов

new_variable=$( awk 'BEGIN{RS=ORS=" "}!a[$0]++' <<<$variable );

Вот как это работает:

RS (разделитель входных записей) устанавливается на пробел, поэтому каждый фрукт в переменной $ обрабатывается как запись, а не поле. Уникальная магия без сортировки происходит с! A [$ 0] ++. Поскольку awk поддерживает ассоциативные массивы, он использует текущую запись ($ 0) как ключ к массиву a []. Если этот ключ не был замечен ранее, значение [$ 0] будет равно '0' (значение awk по умолчанию для неустановленных индексов), который затем инвертируется, чтобы вернуть TRUE. Затем я использую тот факт, что awk по умолчанию будет «печатать $ 0», если выражение возвращает ИСТИНА и не заданы «{команды}». Наконец, [$ 0] увеличивается на единицу, так что этот ключ больше не может возвращать ИСТИНА, и поэтому повторяющиеся значения никогда не печатаются. ORS (разделитель выходных записей) также установлен на пробел для имитации входного формата.

Менее краткая версия этой команды, которая дает такой же результат, будет следующей:

awk 'BEGIN{RS=ORS=" "}{ if (a[$0] == 0){ a[$0] += 1; print $0}}'

Должен любить awk =)

ИЗМЕНИТЬ

Если вам нужно сделать это в чистом Bash 2.1+, я бы посоветовал это:

#!/bin/bash    

variable="apple lemon papaya avocado lemon grapes papaya apple avocado mango banana"
temp="$variable"

new_variable="${temp%% *}"

while [[ "$temp" != ${new_variable##* } ]]; do
   temp=${temp//${temp%% *} /}
   new_variable="$new_variable ${temp%% *}"
done

echo $new_variable;
20
ответ дан 6 December 2019 в 05:38
поделиться

Эта версия конвейера работает с сохранением исходного порядка:

variable=$(echo "$variable" | tr ' ' '\n' | nl | sort -u -k2 | sort -n | cut -f2-)
6
ответ дан 6 December 2019 в 05:38
поделиться

Pure Bash:

variable="apple lemon papaya avocado lemon grapes papaya apple avocado mango banana"

declare new_value=''

for item in $variable; do
  if [[ ! $new_value =~ $item ]] ; then   # first time?
    new_value="$new_value $item"
  fi
done
new_value=${new_value:1}                  # remove leading blank
3
ответ дан 6 December 2019 в 05:38
поделиться

shell

declare -a arr
variable="apple lemon papaya avocado lemon grapes papaya apple avocado mango banana"
set -- $variable
count=0
for c in $@
do
    flag=0
    for((i=0;i<=${#arr[@]}-1;i++))
    do
        if [ "${arr[$i]}" == "$c" ] ;then
            flag=1
            break
        fi
    done
    if  [ "$flag" -eq 0 ] ; then
        arr[$count]="$c"
        count=$((count+1))
    fi
done
for((i=0;i<=${#arr[@]}-1;i++))
do
   echo "result: ${arr[$i]}"
done

Результат при запуске:

linux# ./myscript.sh
result: apple
result: lemon
result: papaya
result: avocado
result: grapes
result: mango
result: banana

ИЛИ если вы хотите использовать gawk

awk 'BEGIN{RS=ORS=" "} (!($0 in a) ){a[$0];print}'
1
ответ дан 6 December 2019 в 05:38
поделиться

Z Shell:

% variable="apple lemon papaya avocado lemon grapes papaya apple avocado mango banana"
% print ${(zu)variable}                                                               
apple lemon papaya avocado grapes mango banana
1
ответ дан 6 December 2019 в 05:38
поделиться

В чистом переносимом виде sh :

words="apple lemon papaya avocado lemon grapes papaya apple avocado mango banana"
seen=
for word in $words; do
  case $seen in
    $word\ * | *\ $word | *\ $word\ * | $word) 
      # already seen
      ;;
    *)
      seen="$seen $word"
      ;;
  esac
done
echo $seen
3
ответ дан 6 December 2019 в 05:38
поделиться