Como posso modificar variáveis

0

Eu tenho a seguinte variável:

col=1,3,4,

Existe alguma maneira de selecionar os números dentro da variável: (isto é, 1 3 4 e trabalhar com eles?

Como escolher a coluna "1", "3" ou "4" de um arquivo .txt ?

    
por crocket 19.10.2013 / 12:28

5 respostas

3

Is there anyway to select the numbers of the variable: 1 3 4 and work with them?

$ col=1,3,4,; IFS=","; for i in $col; do echo "i= $i"; done
i= 1
i= 3
i= 4

Mas alterar o Separador de campo interno ( IFS ) pode ser perigoso, pois é uma variável de todo o sistema e muitos aplicativos dependem de seu valor padrão. Por isso, é recomendável que você salve e restaure seu valor original toda vez que precisar modificá-lo.

$ col=1,3,4,
$ OLDIFS=$IFS
$ IFS=","; for i in $col; do echo "i= $i"; done
i= 1
i= 3
i= 4

$ IFS=$OLDIFS
    
por 19.10.2013 / 12:45
2

Você pode usar um pouco de read magic:

i=1,2,3,; echo $i | { IFS=","; read a b c; echo "$a|$b|$c"; }
i=1,2,3,; read a b c <<<$(IFS=","; echo $i); echo "$a|$b|$c"
i=1,2,3,; echo $i | { while read -d\, j; do echo $j; done; }
    
por 19.10.2013 / 13:43
2

Você pode configurar a lista como uma variável de matriz.

#!/bin/bash
col=1,3,4
declare -a colArray=($(echo $col | tr ',' ' '))
echo ${#colArray[@]} # number of elements in the array
echo ${colArray[0]}  # first element of the array
for i in $(seq 0 $((${#colArray[@]}-1)))  # loop through the array
do
    echo ${colArray[$i]}
done

Fazer um loop pode ser feito de várias maneiras diferentes, eu apenas escolhi um. Muito mais seguro do que brincar com o IFS.

    
por 19.10.2013 / 14:27
1

Dado que $col é apenas uma string, você só precisa converter essas vírgulas ( , ) em espaços e poderá usar um loop como for para iterar por elas.

Aqui estão dois métodos, usando sed no primeiro e o recurso de pesquisa e substituição no Bash:

$ echo $col | sed 's/,/ /g'
1 3 4 

$ echo ${col//,/ }
1 3 4

Se você quiser seletivamente um dos valores, use cut :

$ echo $col | cut -d"," -f1
1
$ echo $col | cut -d"," -f2
3
$ echo $col | cut -d"," -f3
4

Exemplo

Aqui está a solução sed com um loop, enquanto "percorremos" os valores de $col .

$ for i in $(echo $col | sed 's/,/ /g'); do echo $i; done
1
3
4

Cada vez que passamos pelo loop, poderíamos colocar os valores de $col em outra variável ou fazer o que for necessário, enquanto você percorre $col .

for  i in $(echo $col | sed 's/,/ /g'); do
  ...use $i in here...
done
    
por 19.10.2013 / 15:02
0

A alteração do IFS (Internal Field Separator) pode ser perigosa, pois é uma variável de todo o sistema e muitos aplicativos dependem de seu valor padrão. Por isso, é recomendável que você salve e restaure seu valor original toda vez que precisar modificá-lo.

Exemplo usando uma sugestão anterior:

#!/bin/bash
col=1,3,4,
OLD_IFS=$IFS 
IFS=","
for i in $col; do 
  echo "i= $i"
done
IFS=$OLD_IFS
    
por 19.10.2013 / 14:06