Лучший способ моделировать “группу” от удара?

Предупреждение: Деление на ноль

Предупреждающее сообщение «Подразделение на ноль» является одним из наиболее часто задаваемых вопросов среди новых разработчиков PHP. Эта ошибка не вызовет исключения, поэтому некоторые разработчики будут иногда подавлять предупреждение, добавляя оператор подавления ошибок @ перед выражением. Например:

$value = @(2 / 0);

Но, как и при любом предупреждении, наилучшим подходом было бы отслеживать причину предупреждения и разрешать его. Причина предупреждения будет происходить из любого экземпляра, где вы пытаетесь разделить на 0, переменную, равную 0, или переменную, которая не была назначена (поскольку NULL == 0), потому что результат будет «неопределенным».

Чтобы исправить это предупреждение, вы должны переписать свое выражение, чтобы проверить, что значение не равно 0, если оно есть, сделать что-то еще. Если значение равно нулю, вы не должны делиться или изменять значение на 1, а затем делить так, что деление приводит к эквиваленту того, что он разделен только дополнительной переменной.

if ( $var1 == 0 ) { // check if var1 equals zero
    $var1 = 1; // var1 equaled zero so change var1 to equal one instead
    $var3 = ($var2 / $var1); // divide var1/var2 ie. 1/1
} else {
    $var3 = ($var2 / $var1); // if var1 does not equal zero, divide
}

Вопросы, относящиеся:

215
задан Luke Girvin 25 September 2014 в 02:43
поделиться

10 ответов

sort ip_addresses | uniq -c

Это распечатает количество сначала, но кроме которого это должно быть точно, что Вы хотите.

383
ответ дан Joachim Sauer 23 November 2019 в 04:21
поделиться

Быстрый и грязный метод следующие:

cat ip_addresses | sort -n | uniq -c

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

PS

, Если команда вида опущена, Вы не получите корректные результаты, поскольку uniq только смотрит на последовательные идентичные строки.

46
ответ дан om-nom-nom 23 November 2019 в 04:21
поделиться

Каноническим решением является то, упомянутое другим респондентом:

sort | uniq -c

Это короче и более кратко, чем, что может быть записано в Perl или awk.

Вы пишете, что не хотите использовать вид, потому что размер данных больше, чем размер оперативной памяти машины. Не недооценивайте качество реализации команды вида Unix. Вид использовался для обработки очень больших объемов данных (думайте исходный AT& T, тарифицирующий данные) на машинах с 128k (это составляет 131 072 байта) памяти (PDP-11). Когда вид встречается с большим количеством данных, чем предварительно установленный предел (часто настраиваемый близко к размеру оперативной памяти машины), это сортирует данные, которые это считало в оперативной памяти и пишет его во временный файл. Это тогда повторяет действие со следующими блоками данных. Наконец, это выполняет сортировку слиянием на тех промежуточных файлах. Это позволяет виду работать над данными, много раз больше, чем оперативная память машины.

19
ответ дан Diomidis Spinellis 23 November 2019 в 04:21
поделиться

Кажется, что необходимо или использовать большой объем кода для моделирования хешей в ударе, чтобы получить линейное поведение или придерживаться <забастовка>, квадратичная сверхлинейные версии.

Среди тех версий, решение saua является лучшим (и самым простым):

sort -n ip_addresses.txt | uniq -c

я нашел http://unix.derkeiler.com/Newsgroups/comp.unix.shell/2005-11/0118.html . Но это ужасно как ад...

4
ответ дан Community 23 November 2019 в 04:21
поделиться

Вероятно, можно использовать саму файловую систему в качестве хэш-таблицы. Псевдокод следующим образом:

for every entry in the ip address file; do
  let addr denote the ip address;

  if file "addr" does not exist; then
    create file "addr";
    write a number "0" in the file;
  else 
    read the number from "addr";
    increase the number by 1 and write it back;
  fi
done

В конце, все, что необходимо сделать, должно пересечь все файлы и распечатать имена файлов и числа в них. С другой стороны, вместо того, чтобы провести подсчет, Вы могли добавить пространство или новую строку, каждый раз в файл, и в конце просто смотрит на размер файла в байтах.

3
ответ дан PolyThinker 23 November 2019 в 04:21
поделиться

Я чувствую, что awk ассоциативный массив также удобен в этом случае

$ awk '{count[$1]++}END{for(j in count) print j,count[j]}' ips.txt

группа А сообщением здесь

3
ответ дан SriniV 23 November 2019 в 04:21
поделиться

Я понимаю, что Вы ищете что-то в Bash, но в случае, если кто-то еще мог бы искать что-то в Python, Вы могли бы хотеть рассмотреть это:

mySet = set()
for line in open("ip_address_file.txt"):
     line = line.rstrip()
     mySet.add(line)

, Поскольку значения в наборе уникальны по умолчанию, и Python довольно хорош в этом материале, Вы могли бы выиграть что-то здесь. Я не протестировал код, таким образом, он мог бы прослушиваться, но это могло бы получить Вас там. И если Вы хотите считать случаи, использование dict вместо набора легко реализовать.

Редактирование: я - паршивый читатель, таким образом, я ответил неправильно. Вот отрывок с dict, который считал бы происшествия.

mydict = {}
for line in open("ip_address_file.txt"):
    line = line.rstrip()
    if line in mydict:
        mydict[line] += 1
    else:
        mydict[line] = 1

словарь mydict теперь содержит список уникального IP как ключи и сумма времен, они произошли как свои значения.

0
ответ дан wzzrd 23 November 2019 в 04:21
поделиться

Вид может быть опущен, если порядок не значительный

uniq -c <source_file>

или

echo "$list" | uniq -c

, если исходный список является переменной

-8
ответ дан Sudden Def 23 November 2019 в 04:21
поделиться

Я сделал бы это как это:

perl -e 'while (<>) {chop; $h{$_}++;} for $k (keys %h) {print "$k $h{$k}\n";}' ip_addresses

но uniq мог бы работать на Вас.

0
ответ дан nicerobot 23 November 2019 в 04:21
поделиться

для суммирования нескольких полей на основе группы существующих полей используйте пример ниже: (замените $ 1, $ 2, $ 3, $ 4 в соответствии с вашими требованиями)

cat file

US|A|1000|2000
US|B|1000|2000
US|C|1000|2000
UK|1|1000|2000
UK|1|1000|2000
UK|1|1000|2000

awk 'BEGIN { FS=OFS=SUBSEP="|"}{arr[$1,$2]+=$3+$4 }END {for (i in arr) print i,arr[i]}' file

US|A|3000
US|B|3000
US|C|3000
UK|1|9000
20
ответ дан 23 November 2019 в 04:21
поделиться
Другие вопросы по тегам:

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