Блок ввода-вывода имеет размер блока для обмена с блочным устройством.
Блок(stat
)представляет собой количество ячеек файловой системы (и, естественно, зависит от типа файловой системы ), необходимого для хранения файла. Это легко проверить:
$ stat shell
File: ‘shell’
Size: 4295 Blocks: 16 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 16997503 Links: 1
Access: (0755/-rwxr-xr-x) Uid: ( 1000/ yurij) Gid: ( 1000/ yurij)
Access: 2018-04-11 18:17:38.614827347 +0300
Modify: 2018-04-11 18:17:34.359967012 +0300
Change: 2018-04-19 01:07:03.729000000 +0300
Birth: -
$ pwd
/home/yurij/develop/shell/usr/local/bin
$ sudo blockdev --getbsz /dev/mapper/cl-root
[sudo] password for yurij:
512 # cell size in bytes
8 КБ = 8192 байта
8192 байта / 512 байт = 16 блоков
filefrag
:
$ filefrag -v shell
Filesystem type is: 58465342
File size of shell is 4295 (2 blocks of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 1: 1141480.. 1141481: 2: eof
shell: 1 extent found
Для чтения/записи файла с/на блочное устройство необходимы две операции чтения/записи.
Проблема:
FNR>o
>
с неинициализированным значением o
не инициализирован, он имеет числовое значение 0
и строковое значение пустой строки o
устанавливается вместе с /^title/ { o=FNR+2 }
, но /^title/
не появляется до третьей записи. Таким образом, для первых двух записей o
не инициализируется, а FNR>o
оценивается как true
(, потому что FNR==1
и FNR==2
являютсяgreater than zero
)Возможное решение:
o && FNR>o
o
не должно быть -нулем, в дополнение кFNR>o
Кроме того, o
несколько сбивает с толку однобуквенное имя переменной -— рассмотрите возможность использования буквы, например n
, или более описательного слова, такого как output
, вместо
print sprintf("%-10s %-10d %-10s",FILENAME,o,$0)
можно упростить до:
printf("%-10s %-10d %-10s\n",FILENAME,o,$0)
или даже:
printf "%-10s %-10d %-10s\n",FILENAME,o,$0