Определение переменной в awk

Правильная командная строка:

mount -o subvol=foo /dev/sda1 /mnt/foo
1
14.11.2018, 21:11
3 ответа

Попробуйте следующее:

awk '
{
   if(!match($NF,"LY1[^_]*")){
     print
   }
   else {
     tag=substr($NF,RSTART,RLENGTH)
     print tag
   }
}' input.file

match () находит регулярное выражение.

Эта функция также устанавливает две специальные переменные RSTART и RLENGTH , которые указывают, где начинается и заканчивается регулярное выражение.

1
27.01.2020, 23:25

Поскольку «тег» - это часть после предпоследнего _ , вы можете просто использовать его как разделитель полей:

$ awk -F_ '{if($(NF-1)~/LY1/){print $(NF-1)}else{print}}' file
LY1-1250
LY1-1250
LY1-1250
LY1-1250

Или, чтобы использовать его как переменную:

awk -F_ '{if($(NF-1)~/LY1/){tag=$(NF-1); print tag}else{print}}' file

Я не понимаю, почему у вас есть код в блоке BEGIN {} , который запускался бы только один раз и до того, как были прочитаны какие-либо строки, поэтому NF даже не будет определен.

В общем случае для сохранения подстроки в переменной в awk можно использовать substr или sub . Итак, вы также могли бы сделать что-то вроде:

$ awk '{ 
        if($NF~/LY1/){
            tag=$NF; 
            sub(/.*LY1/,"LY1",tag); 
            sub(/_[^_]*$/,"",tag); 
            print tag
        }
        else{ print } }' file
LY1-1250
LY1-1250
LY1-1250
LY1-1250
1
27.01.2020, 23:25

Думаю, вы неправильно поняли условные выражения awk . Начало каждой строки - это условие. Это более ... awk способ сделать это: А как насчет

awk '
/LY1/ { 
        tag=gensub(/_.*/,"","1",gensub(/.*LY1/,"LY1","1", $NF))
        print tag
        next
}
{
    print
}' input.file

Первое / LY1 / является неявным совпадением -условием - он выполняет выражение только в том случае, если строка ввода соответствует этому регулярному выражению. Выражение начинается с замены всего в этой строке, вплоть до LY1 на LY1 , и помещает это в тег переменной. Затем он печатает тег, и оператор next пропускает все остальные выражения для этой записи .

После этого следует безусловное выражение, которое просто печатает строку как есть - но это не будет выполнено, если предыдущее выражение было выполнено, поскольку это вызвало бы next .

1
27.01.2020, 23:25

Теги

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