ls -l
даст вам кажущийся размер файла, то есть число байтов, которое программа прочитает, если прочитает файл от начала до конца. du
даст вам размер файла «на диске».
По умолчанию du
дает вам размер файла в количестве дисковых блоков, но вместо этого вы можете использовать -h
, чтобы получить удобочитаемую единицу измерения. См. также руководство для du
вашей системы.
Обратите внимание, что с GNU coreutil du
(, который, вероятно, используется в Linux ), использование -b
для получения байтов подразумевает опцию --apparent-size
. Это не то, что вы хотите использовать, чтобы получить количество байтов, фактически используемых на диске. Вместо этого используйте --block-size=1
или -B 1
.
В GNU ls
вы также можете выполнить ls -s --block-size=1
над файлом. Это даст тот же номер, что и du -B 1
для файла.
Пример:
$ ls -l file
-rw-r--r-- 1 myself wheel 536870912 Apr 8 11:44 file
$ ls -lh file
-rw-r--r-- 1 myself wheel 512M Apr 8 11:44 file
$ du -h file
24K file
$ du -B 1 file
24576 file
$ ls -s --block-size=1 file
24576 file
Это означает, что это файл размером 512 МБ, который занимает на диске около 24 КБ. Это разреженный файл (в основном нули, которые на самом деле не записываются на диск, а представлены как логические «дыры» в файле ). Разреженные файлы распространены при работе с предварительно -выделенными большими файлами, например. образы дисков для виртуальных машин или файлы подкачки и т. д. Создать разреженный файл можно быстро, а заполнять его нулями — медленно (и не нужно ).
См. также руководство для fallocate
в вашей системе Linux.
Используя GNU awk и полагаясь на разделитель полей, установленный на шаблон сахара s
:
awk -F'\\<s\\>' '
sugar<NF{sugar=NF;pie=$1}
END{print pie "has the largest amount of sugar with " sugar-1 " sugar"}
' file
Единственным оператором является установка переменной sugar
числа s
, найденного в строке, и установка имени круговой диаграммы.
Когда файл проанализирован, оператор END
выполняется и печатает требуемую строку.
Вам не нужно хранить счетчики в массиве и перебирать его для каждого нового значения -просто сохраните текущий максимум и соответствующий ему круг:
#!/bin/awk -f
BEGIN {
sugar_max = 0;
pie_max = "";
}
{
pie = $1;
$1 = ""; sugar = gsub("s","");
if (sugar > sugar_max) {
sugar_max = sugar;
pie_max = pie;
}
}
END {
printf "%s pie has the largest amount of sugar with %d sugars\n", pie_max, sugar_max;
}
В этом случае блок BEGIN
не является строго обязательным, поскольку переменные awk неявно инициализируются.
Как насчет
awk '
function SCNT(FLD) { x = $FLD; return gsub (/s/, "&", $FLD)}
SMX < SC = SCNT(0) - SCNT(1) - SCNT(2) {SMX = SC
LN = $0
}
END {print "Largest sugar count of", SMX, "in", LN
}
' file
Largest sugar count of 3 in Orange pie s s s