Инициализация полевых разделителей по условию в 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