Obtendo valores fora da string

0

Eu tenho uma variável com string como abaixo

name=@col1, zip_cd=@col2, district=@col3, city=@col4
A lista de colunas

pode aumentar.

Eu preciso de um resultado abaixo

@col1,@col2,@col3,@col4
    
por Manoj Y 22.02.2017 / 06:12

5 respostas

2

Se o seu único objetivo for imprimir todos os valores das variáveis (por exemplo, @col1,@col2,@col3,@col4 ), use uma matriz:

$ array=($name $zip_cd $district $city)

Saída:

$ oIFS="$IFS" # save IFS for later
$ IFS=","
$ echo ${array[*]}
@col1,@col2,@col3,@col4
$ IFS="$oIFS"'enter code here'

Se você deseja carregar colunas nas variáveis, imprima-as:

$ line="foo bar qaz qux"
$ oIFS="$IFS" # save IFS for later
$ IFS=" " # space, if $line has spaces/tabs, convert them into single spaces below
$ line='sed 's/\s\+/ / <<< $line'
$ array=($line)
$ IFS="," # for display
$ echo ${array[*]}
foo,bar,qaz,qux
    
por 22.02.2017 / 07:17
0
$ myvar='name=@col1, zip_cd=@col2, district=@col3, city=@col4'


$ echo $myvar
name=@col1, zip_cd=@col2, district=@col3, city=@col4

$ echo $myvar | awk -F, '{for(i=1;i<=NF;i++){split($i,a,"=");printf("%s,",a[2])}}'
@col1,@col2,@col3,@col4
    
por 22.02.2017 / 06:40
0

Você pode usar awk :

echo "name=@col1, zip_cd=@col2, district=@col3, city=@col4" | awk 'BEGIN{FS="[^=,]*=";OFS=""} {$1=$1}1'

O separador de campo FS está definido para o lado esquerdo da construção key=value , incluindo o sinal = .

O separador do campo de saída está em branco, pois já existe uma vírgula após o valor.

O {$1=$1} está acionando awk para aplicar os FS e OFS no registro inteiro.

Por fim, o 1 está acionando a ação padrão no awk: imprima o registro.

    
por 22.02.2017 / 08:34
0
var='name=@col1, zip_cd=@col2, district=@col3, city=@col4'

newvar=$( printf '%s' "$variable" | awk 'BEGIN { RS=" "; ORS=""; FS="=" } { print $2 }' )

printf '%s\n' "$newvar"
@col1,@col2,@col3,@col4

O script awk trata a entrada como uma série de registros delimitados por espaços bu que definem o separador de registro ( RS ) como um caractere de espaço (o padrão é uma nova linha). Isso nos dá os seguintes registros:

name=@col1,
zip_cd=@col2,
district=@col3,
city=@col4

Ele também divide cada um desses registros em campos no caractere = (configurando FS , o separador de campos), o que nos dá os registros divididos em colunas, desta forma:

name     @col1,
zip_cd   @col2,
district @col3,
city     @col4

Em seguida, imprime o segundo campo de cada registro. Ao fazer isso, ele usa um separador de registro vazio (o separador de registro de saída padrão, ORS , é uma nova linha), o que nos dá a saída desejada.

Eu coloco a saída de awk em uma nova variável e a imprimo na saída padrão.

    
por 22.02.2017 / 08:34
0

Bash

VAR='name=@col1, zip_cd=@col2, district=@col3, city=@col4'
echo "$VAR" |
while IFS= read -r line
do
   IFS='=,'; set -f; set -- $line
   while case $# in 0 ) break ;; esac
   do
      shift
      printf '%s' "${1}${2+,}"
      shift
      ${1+':'} echo
   done
done

Sed

echo "$VAR" |
sed -ne '
   H;g
   :loop
      s/\(\n\)[^=]*=\([^,]*,\{0,1\}\)//
   tloop
   P
'

Perl

echo "$VAR" |
perl -F'/=|,/' -lpe '
   $_ = join ",", grep { $a++ % 2 } @F;
'
    
por 22.02.2017 / 09:43