Разница во флаге
-h
предназначен для удобочитаемого вывода, который будет использовать мегабайты. -b
использует байты. И, конечно, -s
для обобщения
Со страницы руководства du
-b --bytes Print sizes in bytes, overriding the default block size (*note Block size::).
-h --human-readable Append a size letter such as 'M' for megabytes to each size. Powers of 1024 are used, not 1000; 'M' stands for 1,048,576 bytes. Use the '-H' or '--si' option if you prefer powers of 1000.
-s --summarize Display only a total for each argument.
Таким образом, в вашем первом вызове du -sh
это суммирование суммы в удобочитаемой форме с использованием мегабайтов в степени 1024.
Во втором вызове du -sb
аргумент суммируется с использованием байтов.
NR
означает «номер записи» и относится к строке, переданной в awk
. (По умолчанию каждая новая непустая строка является новой записью. Можно определить другой разделитель записей RS
. Тогда термин line
здесь уже не подходит.)
NF
означает «количество полей» и относится к количеству столбцов в строке. Из-за $
перед NF
мы запрашиваем значение в последнем столбце. (NB :По умолчанию любой набор пробелов или табуляций используется в качестве разделителя столбцов или разделителя полейFS
)
||
означает «или».
Таким образом, ваша команда распечатает первую строку в PGC2.SCZ.1.dat
и все строки, где значение в последнем столбце меньше 0,05/1783.
Прежде всего, поскольку вы изучаете *никсов, это пример "бесполезного использования кота" (известного тропа в *мире никсов ). cat file | awk command
здесь не нужен, вы можете просто сделать awk command file
.
Так или иначе, на awk. Действие по умолчанию, когда выражение оценивается как истинное в awk, состоит в том, чтобы напечатать текущую строку. NR
— номер текущей строки, поэтому NR == 1
будет верным для первой строки файла. Затем awk разбивает свой ввод на поля с пробелами (или чем-то еще, что вы выбираете, используя опцию -F
). Затем поля доступны как переменные $1
, $2
,... $NF
, где NF
— количество полей. Поэтому $NF
— это содержимое последнего поля.
Собрав все это воедино,выражение awk 'NR == 1 || $NF < 0.05/1783'
будет истинным в первой строке и в любой другой строке, последнее поле которой меньше, чем 0.05
, деленное на 1783
.
Вы могли бы написать то же самое менее идиоматически, но более ясно, как:
awk '{
if(NR ==1 ){
print
}
else if ($NF < 0.05/1783){
print
}
}' PGC2.SCZ.1.dat