dividir linha usando delimitador e armazenar ambos os campos em uma variável diferente

dividir linha usando delimitador e armazenar ambos os campos em uma variável diferente

Eu tenho um arquivo de texto com várias linhas. Estou usando o comando while para ler o arquivo em linha, mas preciso armazenar os valores em variáveis ​​separadas e usá-los no script de shell final.

OcorteO comando delimita o arquivo completo e não a linha de leitura.

Exemplo my_file.txt:

d1:jobid1
id2:jobid2

Estou usando o loop while abaixo para ler o arquivo em linha

while IFS= read -r line; do
    jobid=`cut -d: -f2`
    id=`cut -d: -f1`

#remaining shell-script dependent upon variables#

done < my_file.txt

Quero armazenar o jobid e o id de cada linha my_file.txte executar o script final.Cada linha está em uma nova linha

Precisa de ajuda para armazenar os valores nas variáveis ​​de forma recursiva. Se houver uma maneira melhor de ler as linhas, delimitar e armazenar os dois campos separadamente.

Responder1

cutlê a partir da entrada padrão por padrão. Na sua substituição de comando, a entrada padrão é herdada da entrada padrão do loop (já que você não fornece nenhuma outra entrada explícita para as chamadas para cut). A entrada padrão do loop vem do seu arquivo de entrada.

O efeito é que a primeira linha do seu arquivo é lida por read, enquanto todas as outras linhas são lidas pela primeira chamada para cut. O valor na jobidvariável seria, portanto, uma sequência de IDs de trabalho delimitada por nova linha, enquanto a idvariável estaria vazia. O loop executaria apenas uma única iteração.

Vocêpoderia usar, por exemplo,

id=$( printf '%s\n' "$line" | cut -d: -f1 )

# or: id=$( cut -d: -f1 <<<"$line" )
# (in shells that supports "here-strings")

mas isso seria desnecessário, pois seria mais limpo e muito mais eficiente fazer

while IFS=: read -r id jobid; do
    # code that uses "$id" and "$jobid" goes here
done <my_file.txt

Isso usa o fato de readpoder ler dados de uma linha de entrada em múltiplas variáveis ​​ao mesmo tempo. Ao definir IFSdois pontos, a linha é dividida nos dois pontos e o primeiro campo é lido idenquanto o restante é lido jobid. Não há necessidade de ligar cut.

informação relacionada