Script de shell: linha dividida

3

Eu preciso dividir uma linha com duas strings separadas por um espaço como: key value .

Eu tentei:

key=$(awk -FS=" " {print $1} line)
value=$(awk -FS=" " {print $2} line)

Mas estou recebendo:

awk: line 2: missing } near end of file

Alguma idéia?

    
por Jordi 28.06.2018 / 09:09

5 respostas

6

Um script awk na linha de comando deve ter aspas simples:

awk -F ' ' '{ print $1 }' filename

Observe as aspas simples em torno de { ... } e também que a maneira correta de definir FS é através de -F ou -v FS=... ou em BEGIN , mas não com -FS=... . / p>

Seu comando, do jeito que você o escreveu, também assume que line é um nome de arquivo.

Se $line for uma string com um único espaço, você poderá separá-la em duas strings com

first_part=${line% *}   # removes the space and everything after it
second_part=${line#* }  # removes the space and everything before it

Da mesma forma, se $line for uma string com um = :

first_part=${line%=*}   # removes the = and everything after it
second_part=${line#*=}  # removes the = and everything before it
    
por 28.06.2018 / 09:12
3

Você também pode usar uma matriz para dividir uma linha em espaços:

se a linha for um string

  arr=($line)
  key="${arr[0]}"
  value="${arr[1]}"

Note:- If the first word of $line is * then the arr array will contain all the filenames in the current directory. So to be on the safe side and avoid such situations , use

set -f; arr=($line); set +f key="${arr[0]}" value="${arr[1]}"

Se a linha for file

while read -r words
do
  set -- $words
  key=$1
  value=$2
done < line
    
por 28.06.2018 / 09:22
1

Você pode facilmente conseguir isso, sem usar o awk, que é destinado a uma manipulação de dados mais complexa. O comando cut bash é tudo que você precisa.

key="$(echo "$line" | cut -d ' ' -f 1)"
value="$(echo "$line" | cut -d ' ' -f 2)"

Espero que tenha ajudado.

    
por 28.06.2018 / 12:15
0

Você pode usar os recursos de expansão de parâmetros do shell em vez de chamar para um programa externo:

key=${line%% *}     # from the end remove the longest string matching
                    # a space followed by any characters

value=${line#* }    # from the start remove the shortest string matching
                    # any characters followed by a space
    
por 28.06.2018 / 13:36
0

ler

Use apenas read :

read key value

Tudo antes do primeiro espaço na linha entra em key e tudo depois dele (incluindo quaisquer espaços adicionais) entra em value .

    
por 28.06.2018 / 15:49