2010-06-30 2 views
1

Дорогие друзьяСЕПГ/AWK + Количество полукокса до соответствующего полукокса

У меня есть следующие:

PARAM=1,2,3=,4,5,6,=,7#,8,9 

Как подсчитывают СЭД/не AWK четный символ «=» между PARAM до символа «#»

Например

PARAM=1,2,3=,4,5,6,=,7#,8,9 

Затем СЭД/AWK должен возвращать 3

ИЛИ

PARAM=1,2,3=,4=,5=,6,=,7#,=8,9 

Затем СЭД/AWK должен возвращать 5

ТНХ

Яэль

ответ

1

вы можете использовать этот один лайнер нет нужно использовать split(), как и в ответе. Просто используйте gsub(). Он вернет счет заменяемой вещи. Также установите полевой разделитель на «#», поэтому вам нужно иметь дело только с первым полем.

$ echo "PARAM=1,2,3=,4,5,6,=,7#,8,9" | awk -F"#" '{print gsub("=","",$1)}' 
3 
$ echo "PARAM=1,2,3=,4=,5=,6,=,7#,=8,9" | awk -F"#" '{print gsub("=","",$1)}' 
5 
+0

Это не удастся, если есть знак равенства до или внутри« PARAM »(OP задан 'между PARAM до символа # #. Я не уверен, что подразумевается под «четным» в «четном» символе. –

0

Вот AWK-скрипт, который находит подсчет с помощью разделителей полей/раскол. IT устанавливает разделитель полей в символ #, а затем разбивает первое слово (материал слева от первого # на знаке =. Возможно, это нечетный подход, но это один метод. Обратите внимание, что он предполагает, что нет = символов .. слева парам Если это плохое предположение, что это не будет работать

BEGIN{ FS="#" } 
/PARAM.*#/{ 
    n = split($1, a, "="); 
    printf("Count = %d\n", n-1); 
} 

это может быть сделано с одной линии, а:.

[]$ export LINE=PARAM=1,2=3,4=5#=6 
[]$ echo $LINE | awk 'BEGIN{FS="#"}/PARAM.*#/{n=split($1,a,"="); print n-1;}' 
3 
+0

возможность написать в одной строке Поскольку мне нужно запустить AWK в Баш скрипт Яэль – yael

+0

, например, эхо $ ЛИНИИ | awk ........ (в LINE у меня есть (PARAM = 1,2,3 =, 4 =, 5 =, 6, =, 7 #, = 8,9) yael – yael

+0

@yael, Я добавил пример с одной строкой. –

Смежные вопросы