awk использовать запятую (необязательно) с несколькими пробелами в качестве FS - PullRequest
1 голос
/ 05 января 2010

Что мне нужно сделать, это проанализировать строку следующей формы

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

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

BEGIN {
    FS = ",?\ +" 
}

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

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

Оливер

Ответы [ 3 ]

1 голос
/ 05 января 2010

Ваш 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...]

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

1 голос
/ 05 января 2010

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
0 голосов
/ 05 января 2010

@ 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
...