Правильная командная строка:
mount -o subvol=foo /dev/sda1 /mnt/foo
Попробуйте следующее:
awk '
{
if(!match($NF,"LY1[^_]*")){
print
}
else {
tag=substr($NF,RSTART,RLENGTH)
print tag
}
}' input.file
match ()
находит регулярное выражение.
Эта функция также устанавливает две специальные переменные RSTART
и RLENGTH
, которые указывают, где начинается и заканчивается регулярное выражение.
Поскольку «тег» - это часть после предпоследнего _
, вы можете просто использовать его как разделитель полей:
$ 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
Думаю, вы неправильно поняли условные выражения awk
. Начало каждой строки - это условие. Это более ... awk
способ сделать это: А как насчет
awk '
/LY1/ {
tag=gensub(/_.*/,"","1",gensub(/.*LY1/,"LY1","1", $NF))
print tag
next
}
{
print
}' input.file
Первое / LY1 /
является неявным совпадением
-условием - он выполняет выражение только в том случае, если строка ввода соответствует этому регулярному выражению. Выражение начинается с замены всего в этой строке, вплоть до LY1
на LY1
, и помещает это в тег переменной. Затем он печатает тег, и оператор next
пропускает все остальные выражения для этой записи .
После этого следует безусловное выражение, которое просто печатает строку как есть - но это не будет выполнено, если предыдущее выражение было выполнено, поскольку это вызвало бы next
.