Estou trabalhando em um longo script Bash. Quero ler células de um arquivo CSV em variáveis Bash. Posso analisar linhas e a primeira coluna, mas não qualquer outra coluna. Este é meu código até agora:
cat myfile.csv|while read line
do
read -d, col1 col2 < <(echo $line)
echo "I got:$col1|$col2"
done
Está apenas imprimindo a primeira coluna. Como um teste adicional, tentei o seguinte:
read -d, x y < <(echo a,b,)
E $ y está vazio. Então eu tentei:
read x y < <(echo a b)
E $ y está b
. Por quê?
awk
usar$1
,$2
, etc?Respostas:
Você precisa usar em
IFS
vez de-d
:Observe que para a análise de CSV de propósito geral, você deve usar uma ferramenta especializada que pode lidar com campos citados com vírgulas internas, entre outros problemas que o Bash não pode lidar sozinho. Exemplos dessas ferramentas são
cvstool
ecsvkit
.fonte
command not found
. Apenas asecho
obras.;
:while IFS=";" read col1 col2; do ...
${var}
), mas eu as omito quando não forem necessárias. Para mim, parece mais limpo.Da
man
página:Você está usando o
-d,
que encerrará a linha de entrada na vírgula. Não vai ler o resto da linha. É por isso que $ y está vazio.fonte
Podemos analisar arquivos csv com strings entre aspas e delimitados por say | com o seguinte código
awk analisa os campos de string para variáveis e tr remove a citação.
Um pouco mais lento conforme o awk é executado para cada campo.
fonte
Se você deseja ler um arquivo CSV com algumas linhas, esta é a solução.
fonte