с использованием деления в сценарии awk

Если вы пытаетесь просмотреть содержимое каталога, необходимо указать косую черту в конце пути. Вот так:

ll /application/nginx/
0
15.09.2017, 09:14
3 ответа

В частях awkBEGIN{...}выполняется перед чтением входной строки из ввода, поэтому в вашем коде фактически 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
1
28.01.2020, 02:15
$  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, на которое указывают другие ответы.

Вам также не нужно заключать числа в кавычки, когда они используются в качестве чисел.

1
28.01.2020, 02:15

Есть две проблемы с вашим существующим скриптом.

Первый — это разделитель :, который вы хотите разделить на пробелы и косую черту; поэтому вам нужно указать регулярное выражение, которое соответствует этому, и использовать его как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
4
28.01.2020, 02:15

Теги

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