Если вы пытаетесь просмотреть содержимое каталога, необходимо указать косую черту в конце пути. Вот так:
ll /application/nginx/
В частях awk
BEGIN{...}
выполняется перед чтением входной строки из ввода, поэтому в вашем коде фактически awk
не читается ввод, поэтому он ничего не возвращает. если вы хотите передать его, вам нужно использовать getline
, но он будет читать только одну строку, вы можете использовать цикл for
, чтобы прочитать все.
другая проблема заключается в том, что когда вы используете FS="/"
, он разбивает строки на поля, которые разделены /
, но проблема в том, что $8
не выходит, так как максимальное количество полей всего 5, а те, что заполнены, похожи на это 125 115
, 131 0
, 125 16
и т. д.
Вместо этого вы можете использовать этот код для достижения желаемого. также обратите внимание, что awk
может читать из файла напрямую, не требуется, используя cat
там
awk -F'[/ ]+' 'BEGIN{ OFS="\t"}
{if( ($8>0) && ($8/$9 >= 0.01) || ($10>0) && ($10/$11 >= 0.01))
{ print $1,$2 }
}' infile
$ awk '{ split($(NF-1),a,/\//) } { split($NF,b,/\//) } a[1]/a[2] > 0.01 || b[1]/b[2] > 0.01 { print $1, $2 }' file.in
2L 10000133
2L 10000374
Это разбивает последние два поля по отдельности на символ /
и сохраняет части в двух массивах a
и b
. Если какое-либо из делений при выполнении дает число больше 0,01, выводятся два первых поля.
$NF
— значение последнего поля (столбца )во входной записи (строки ). и $(NF-1)
— предпоследнее значение поля.
Проблема с вашим кодом в том, что вы делаете все в блоке BEGIN
. Этот блок в основном предназначен для инициализации и будет выполняться до того, как какие-либо данные будут фактически считаны. Существует также проблема с выбранным значением FS
, на которое указывают другие ответы.
Вам также не нужно заключать числа в кавычки, когда они используются в качестве чисел.
Есть две проблемы с вашим существующим скриптом.
Первый — это разделитель :, который вы хотите разделить на пробелы и косую черту; поэтому вам нужно указать регулярное выражение, которое соответствует этому, и использовать его какFS
:FS="[ /]+"
.
Во-вторых, весь ваш код находится в блоке BEGIN
. Вам необходимо инициализировать разделители в блоке BEGIN
(или в другом месте, , например. с использованием определенных параметров AWK ), затем используйте блок сопоставления для обработки строк.
Эта версия работает:
awk 'BEGIN { FS="[ /]+"; OFS="\t" }
(($8>0) && ($8/$9 >= "0.01") || ($10>0) && ($10/$11 >= "0.01")) {
print $1, $2
}' myfile.txt
Строго говоря, было бы лучше использовать 0.01
вместо "0.01"
, так как вы сопоставляете числовые значения:
awk 'BEGIN { FS="[ /]+"; OFS="\t" }
(($8>0) && ($8/$9 >= 0.01) || ($10>0) && ($10/$11 >= 0.01)) {
print $1, $2
}' myfile.txt