Разобрать строку с разделителями, используя awk, и получить совпадающую строку - PullRequest
0 голосов
/ 03 января 2019

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

Input: 123,src_12,234,456
       1,23,34,src_23,4,56,7
       src_14,12
       12,3,5,src_5
Output: src_12
        src_23
        src_14
        src_5

Логика: мне нужно выбрать строку, в которой есть 'src_'.Это не всегда второй пункт в списке.Положение может измениться.Переменная длина, разделенная.

Ответы [ 7 ]

0 голосов
/ 03 января 2019

Простой grep, возвращающий только (-o) совпадающие слова (-w)

$ grep -wo 'src_[^,]*' file
src_12
src_23
src_14
src_5
0 голосов
/ 03 января 2019

Ищите ^src_xxx,, ,src_xxx, и ,src_xxx$ и печатайте только совпадения без ,.

sed -rn 's/.*(,|^)(src_[^,]*)(,|$).*/\2/p'
0 голосов
/ 03 января 2019

Это может работать для вас (GNU sed):

sed '/\n/!s/src_[^,]*/\n&\n/g;/^src_/P;D' file

Окружить все строки-кандидаты новыми строками, а затем с помощью команд sed P и D сократить каждую строку, печатая только кандидатов спрефикс src_.

0 голосов
/ 03 января 2019

Использование tr

$ cat srinath.txt2
123,src_12,234,456
1,23,34,src_23,4,56,7
src_14,12
12,3,5,src_5
src_6,src_7,16,18

$ A=$(cat srinath.txt2)

$ tr ',' '\n' <<< "$A" | grep ^src
src_12
src_23
src_14
src_5
src_6
src_7
0 голосов
/ 03 января 2019

с bash:

while IFS="," read -a array; do
  for element in "${array[@]}"; do
    [[ $element =~ ^src_ ]] && echo "$element"
  done
done <<< "$variable"

Выход:

src_12
src_23
src_14
src_5
0 голосов
/ 03 января 2019

С простым awk решением:

awk 'match($0,/src_[0-9]+/){print substr($0,RSTART,RLENGTH)}'  Input_file

или

awk '{sub(/.*src/,"src");sub(/\,.*/,"")} 1' Input_file
0 голосов
/ 03 января 2019

Использование Perl

$ cat srinath.txt
123,src_12,234,456
1,23,34,src_23,4,56,7
src_14,12
12,3,5,src_5

$ perl -nle ' /(src_\d+)/ and print $1 ' srinath.txt
src_12
src_23
src_14
src_5

Если в одной строке более одного src_, используйте ниже

$ cat srinath.txt2
123,src_12,234,456
1,23,34,src_23,4,56,7
src_14,12
12,3,5,src_5
src_6,src_7,16,18

$ perl -nle ' while( /(src_\d+)/g ) { print $1 } ' srinath.txt2
src_12
src_23
src_14
src_5
src_6
src_7

Если оно находится в переменной, тогда

$ A=$(cat srinath.txt2)

$ perl -nle ' while( /(src_\d+)/g ) { print $1 } '  <<< "$A"
src_12
src_23
src_14
src_5
src_6
src_7

или

$ export A="123,src_12,234,456,1,23,34,src_23,4,56,7,src_14,12,12,3,5,src_5,src_6,src_7,16,18"

$ perl -nle ' while( /(src_\d+)/g ) { print $1 } '  <<< "$A"
src_12
src_23
src_14
src_5
src_6
src_7

$ perl -le ' $_=$ENV{A}; while( /(src_\d+)/g ) { print $1 } '
src_12
src_23
src_14
src_5
src_6
src_7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...