Shell - Imprime valores em uma string separada por vírgula

0

Eu tenho um arquivo txt com alguns valores separados por vírgula.

cat file.txt

abc,def,ghi
abc,ghi
def,abc,ghi
def,abc
abc,def
abc,def,ghi

Eu quero imprimir esses valores com while do read line from file separados por vírgula.

Por exemplo:

expecting output for Line no 1:
first col=abc
second col=def
third col=ghi
expecting output for Line no 2:
first col=abc
second col=ghi

Se a linha tiver três valores, a linha de leitura deverá ser impressa

first col=value
second col=value
third col=value

else

first col=value
second col=value

Como posso criar este script de shell?

    
por SQLadmin 26.11.2018 / 19:52

3 respostas

0
$ awk -F, '{ print "line " NR; for (i=1;i<=NF;i++) { print "Col " i "="$i } }' input
line 1
Col 1=abc
Col 2=def
Col 3=ghi
line 2
Col 1=abc
Col 2=ghi
line 3
Col 1=def
Col 2=abc
Col 3=ghi
line 4
Col 1=def
Col 2=abc
line 5
Col 1=abc
Col 2=def
line 6
Col 1=abc
Col 2=def
Col 3=ghi

Se você realmente quiser transliterar de colunas numéricas para "primeiro", "segundo", etc., você pode definir uma matriz e usar i como o índice para pesquisar a palavra que corresponde ao número.

    
por 26.11.2018 / 19:58
1

Com o bash você poderia fazer

ordinals=( first second third fourth fifth sixth )
n=0
while IFS=, read -ra cols; do
    echo "line $((++n))"
    for i in "${!cols[@]}"; do
        echo "${ordinals[i]} col=${cols[i]}"
    done
done < file

Que lê as palavras em cada linha em uma matriz chamada cols , então nós interagem sobre os índices dessa matriz para que possamos correlacionar o valor ao ordinal.

Para as 3 primeiras linhas, obtemos

line 1
first col=abc
second col=def
third col=ghi
line 2
first col=abc
second col=ghi
line 3
first col=def
second col=abc
third col=ghi
    
por 26.11.2018 / 20:22
0

Supondo que o arquivo de entrada tenha apenas no máximo três colunas, o seguinte usa um while - read loop para ler os valores separados por vírgulas da entrada padrão e os envia em um formato semelhante ao que você mostrou: / p>

#!/bin/sh

while IFS=, read -r first second third
do
    printf 'Line %d:\n' "$(( ++n ))"
    ${first:+printf 'First:\t%s\n' "$first"}
    ${second:+printf 'Second:\t%s\n' "$second"}
    ${third:+printf 'Third:\t%s\n' "$third"}
done

A expansão do parâmetro ${variable:+word} é expandida para word se variable estiver definido e não vazio. O código usa isso para executar printf para saída se a variável correspondente contiver dados a serem impressos.

Teste nos dados fornecidos:

$ ./script.sh <file
Line 1:
First:  abc
Second: def
Third:  ghi
Line 2:
First:  abc
Second: ghi
Line 3:
First:  def
Second: abc
Third:  ghi
Line 4:
First:  def
Second: abc
Line 5:
First:  abc
Second: def
Line 6:
First:  abc
Second: def
Third:  ghi
    
por 26.11.2018 / 20:24