Предупреждающее сообщение «Подразделение на ноль» является одним из наиболее часто задаваемых вопросов среди новых разработчиков 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
}
Вопросы, относящиеся:
sort ip_addresses | uniq -c
Это распечатает количество сначала, но кроме которого это должно быть точно, что Вы хотите.
Быстрый и грязный метод следующие:
cat ip_addresses | sort -n | uniq -c
, Если необходимо использовать значения в ударе, можно присвоить целую команду переменной удара и затем циклу через результаты.
PS
, Если команда вида опущена, Вы не получите корректные результаты, поскольку uniq только смотрит на последовательные идентичные строки.
Каноническим решением является то, упомянутое другим респондентом:
sort | uniq -c
Это короче и более кратко, чем, что может быть записано в Perl или awk.
Вы пишете, что не хотите использовать вид, потому что размер данных больше, чем размер оперативной памяти машины. Не недооценивайте качество реализации команды вида Unix. Вид использовался для обработки очень больших объемов данных (думайте исходный AT& T, тарифицирующий данные) на машинах с 128k (это составляет 131 072 байта) памяти (PDP-11). Когда вид встречается с большим количеством данных, чем предварительно установленный предел (часто настраиваемый близко к размеру оперативной памяти машины), это сортирует данные, которые это считало в оперативной памяти и пишет его во временный файл. Это тогда повторяет действие со следующими блоками данных. Наконец, это выполняет сортировку слиянием на тех промежуточных файлах. Это позволяет виду работать над данными, много раз больше, чем оперативная память машины.
Кажется, что необходимо или использовать большой объем кода для моделирования хешей в ударе, чтобы получить линейное поведение или придерживаться <забастовка>, квадратичная забастовка> сверхлинейные версии.
Среди тех версий, решение saua является лучшим (и самым простым):
sort -n ip_addresses.txt | uniq -c
я нашел http://unix.derkeiler.com/Newsgroups/comp.unix.shell/2005-11/0118.html . Но это ужасно как ад...
Вероятно, можно использовать саму файловую систему в качестве хэш-таблицы. Псевдокод следующим образом:
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
В конце, все, что необходимо сделать, должно пересечь все файлы и распечатать имена файлов и числа в них. С другой стороны, вместо того, чтобы провести подсчет, Вы могли добавить пространство или новую строку, каждый раз в файл, и в конце просто смотрит на размер файла в байтах.
Я чувствую, что awk ассоциативный массив также удобен в этом случае
$ awk '{count[$1]++}END{for(j in count) print j,count[j]}' ips.txt
группа А сообщением здесь
Я понимаю, что Вы ищете что-то в 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 как ключи и сумма времен, они произошли как свои значения.
Вид может быть опущен, если порядок не значительный
uniq -c <source_file>
или
echo "$list" | uniq -c
, если исходный список является переменной
Я сделал бы это как это:
perl -e 'while (<>) {chop; $h{$_}++;} for $k (keys %h) {print "$k $h{$k}\n";}' ip_addresses
но uniq мог бы работать на Вас.
для суммирования нескольких полей на основе группы существующих полей используйте пример ниже: (замените $ 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