Инициализация полевых разделителей по условию в awk

Я знаю, что инициализация FS в BEGIN - правильная практика, но что, если мне нужны разные разделители полей для разных строк (строк, содержащих определенный шаблон)? Например: мой скрипт на awk

{if($0 ~ /.*youtube.*/){FS="=";print $2}}

Этот код не обрабатывает первую строку. Как это исправить?

1 ответ

Решение

Ты можешь использовать split, Экс получает среднюю дату из третьего поля green

echo "on,cat ,blue|green|red,more" | awk -F, '{split($3,a,"|");print a[2]}'
green

а вы BEGIN Блок не только там, где вы можете установить разделитель полей:

echo "on,two,three" | awk -F, '{print $2}'
echo "on,two,three" | awk '{print $2}' FS=,
echo "on,two,three" | awk 'BEGIN{FS=","} {print $2}'
echo "on,two,three" | awk -v FS=, '{print $2}'

Все это напечатает two

Но они могут иметь различное влияние, когда их можно использовать.

awk -F, 'BEGIN{print FS}'
,

и это не работает и не дает никакого выхода.

awk 'BEGIN{print FS}' FS=,

Вернемся к вашей проблеме:

Это:

awk '{if($0 ~ /.*youtube.*/){FS="=";print $2}}' file

должно быть:

awk '{if($0 ~ /.*youtube.*/){split($0,a,"=");print a[2]}}' file

Вам не нужно проверять какие-либо символы до и после регулярного выражения, поэтому:

awk '{if($0 ~ /youtube/){split($0,a,"=");print a[2]}}' file

И это может быть еще более упрощено:

awk '/youtube/ {split($0,a,"=");print a[2]}' file

Если данные такие:

cat file
youtube=thisisyoutube1 //starts here
youtube=thisisyoutube2
youtube=thisisyoutube3
youtube=thisisyoutube4
yautube=thisisnottobeprinted

Затем сделайте так:

awk -F= '/youtube/ {split($2,a," ");print a[1]}' file
thisisyoutube1
thisisyoutube2
thisisyoutube3
thisisyoutube4
Другие вопросы по тегам