AWK использовать запятую (необязательно), а затем несколько пробелов в качестве FS

Что мне нужно сделать, это разобрать строку следующего вида

-option optionArgument, --alternativeNotation Некоторый текст, ничего интересного...

Я установил FS на

BEGIN {
    FS = ",?\ +" 
}

но это не сработало... оно должно разбиваться на каждое случайное количество пробелов (по крайней мере, на одну), за которыми следует запятая (необязательно). Есть идеи?

Спасибо заранее,

Оливер

3 ответа

FS = "[,]*[ ]+"

Это делает запятую необязательной, но не пробел. Это создает отдельное поле из каждого параметра -option и optionArg, что, как я полагаю, вы хотели.

awk 'BEGIN {FS = "[,]*[ ]+";} { print $1; print $2; print $3; print $4; print $5;}' << EOF
> -option1 hello, --option2 world, -option3
> EOF
-option1
hello
--option2
world
-option3

Ваш FS выполняет то, что вы описываете в своем вопросе, но обратная косая черта перед пробелом может быть избыточной в зависимости от цитирования оболочки:

$ echo '-option optionArgument, --alternativeNotation Some text, nothing of interest...' |  \
  nawk 'BEGIN {
          FS=",? +";
          OFS="][";
        }
        {
          print "["$1,$2,$3,$4"]";
          print "["$5,$6,$7,$8"]";
        }'
[-option][optionArgument][--alternativeNotation][Some]
[text][nothing][of][interest...]

Что вы хотите, чтобы поля были?

@OP, в следующий раз попробуй описать, каков твой конечный результат.

echo "-option1 hello,          --option2 world, -option3" | awk 'BEGIN{FS=",[ ]+"}
{
    for(i=1;i<=NF;i++){
        print $i
    }
}
'

выход

$ ./shell.sh
-option1 hello
--option2 world
-option3

Кроме того, нет необходимости проверять наличие нескольких пробелов. Просто используйте запятую в качестве разделителя и обрежьте оставшиеся пробелы позже.

echo "-option1 hello,          --option2 world, -option3" | awk 'BEGIN{FS=","}
{
    for(i=1;i<=NF;i++){
        gsub(/^ +| +$/,"",$i)
        print $i
    }
}
'

выход

$ ./shell.sh
-option1 hello
--option2 world
-option3
Другие вопросы по тегам