Как интерпретировать команду Unix?

Разница во флаге

-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аргумент суммируется с использованием байтов.

1
09.07.2019, 22:03
2 ответа

NR означает «номер записи» и относится к строке, переданной в awk. (По умолчанию каждая новая непустая строка является новой записью. Можно определить другой разделитель записей RS. Тогда термин lineздесь уже не подходит.)

NFозначает «количество полей» и относится к количеству столбцов в строке. Из-за $перед NFмы запрашиваем значение в последнем столбце. (NB :По умолчанию любой набор пробелов или табуляций используется в качестве разделителя столбцов или разделителя полейFS)

||означает «или».

Таким образом, ваша команда распечатает первую строку в PGC2.SCZ.1.datи все строки, где значение в последнем столбце меньше 0,05/1783.

3
27.01.2020, 23:17

Прежде всего, поскольку вы изучаете *никсов, это пример "бесполезного использования кота" (известного тропа в *мире никсов ). 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
1
27.01.2020, 23:17

Теги

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