Прежде всего, поскольку вы изучаете *никсов, это пример "бесполезного использования кота" (известного тропа в *мире никсов ). 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
Судя по всему, в версии, поставляемой с Ubuntu, были какие-то проблемы. Я скачал последнюю версию (0.27.1 )с веб-сайта sysdig, и теперь результат правильный :
.65099 19:55:54.695520567 7 example (10805) > write fd=1(<f>/dev/pts/0) size=16
65102 19:55:54.695526434 7 example (10805) < write res=16 data=
0x0000: 5374 616e 6461 7264 206f 7574 7075 740a Standard output.
65103 19:55:54.695528110 7 example (10805) > write fd=2(<f>/dev/pts/0) size=15
65104 19:55:54.695529507 7 example (10805) < write res=15 data=
0x0000: 5374 616e 6461 7264 2065 7272 6f72 0a Standard error.