Eu quero imprimir o valor do arquivo csv dinamicamente

0

Eu quero imprimir os valores do arquivo de propriedades dinamicamente Estou usando o código abaixo, mas recebendo resultados errados.

testProperty.properties

edmcws,edmbws,edmwt

Código

file=/ThreadDump/testProperty.properties

count=$(head -1 $file | sed 's/[^,]//g' | wc -c)
echo "$count"

for((i=1;i<=$count;i++))
do
abc=$(awk -F "," '(NR==1){print $($i)}' $file)

echo "$abc"
done

Saída

3
edmcws,edmbws,edmwt
edmcws,edmbws,edmwt
edmcws,edmbws,edmwt

Mas quando codifico o valor, estou obtendo a saída correta.

Código

file=/ThreadDump/testProperty.properties

count=$(head -1 $file | sed 's/[^,]//g' | wc -c)
echo "$count"

for((i=1;i<=$count;i++))
do
abc=$(awk -F "," '(NR==1){print $1}' $file)

echo "$abc"
done

Saída

3
edmcws
edmcws
edmcws
    
por Gaurav Pendse 28.02.2015 / 14:22

2 respostas

1

Como o corpo do awk está entre aspas simples, o awk não vê a variável shell. o awk pensa que você quer dizer uma variável do awk i . Essa variável é indefinida, portanto, em um contexto numérico, ela tem o valor zero. Assim $i é interpretado pelo awk como $0 , ou toda a linha.

Você precisa passar a variável shell para o awk.

for ((i=1; i<=$count; i++))
do
    abc=$(awk -F "," -v col=$i 'NR==1 {print $col}' $file)
    #................^^^^^^^^^...............^^^^
    echo "$abc"
done

No entanto, existe uma maneira melhor do que chamar o awk 3 vezes separadas:

while IFS=, read -ra fields; do
    printf "%s\n" "${fields[@]}"
    # or do stuff with the individual fields
    for ((i=0; i < ${#fields[@]}; i++)); do
        echo "${fields[i]}"
    done
done < "$file" 
  • o loop while , com o conteúdo do arquivo redirecionado para ele, passa pelas linhas do arquivo
  • IFS=, instrui o comando read a fazer a divisão de palavras em vírgulas
  • read -r significa não interpretar nenhum caractere especial como nada além de caracteres regulares.
  • read -a fields lê as palavras na linha em uma variável de matriz chamada fields
por 28.02.2015 / 15:12
1

Você está usando abc=$(awk -F "," '(NR==1){print $($i)}' $file) . Aqui você usa aspas simples em torno do seu arquivo awk. Portanto, variáveis como $i não são substituídas por seu valor.

Se i=1 , awk , portanto, verá literalmente $($i) em vez de $1 , conforme determinado no segundo exemplo.

Você pode atribuir variáveis ao awk usando a opção -v .

Talvez awk não seja a ferramenta perfeita para o trabalho. Eu provavelmente usaria simplesmente

perl -wnle 'print for split ","'
    
por 28.02.2015 / 15:11