Imprima cada campo de CSV na nova linha sem saber o número de campos

3

Eu estava jogando com o IFS hoje e criei um arquivo de texto rápido com uma lista de números separados por vírgulas em uma linha.

1,2,3,4,5

Eu então tentei escrever um script para imprimir cada número em uma nova linha. Eu consegui fazer isso funcionar, mas eu tinha que saber quantos campos havia. Eu estou tentando descobrir como fazer isso em uma lista que é muito mais longa, onde eu não gostaria de especificar todos os campos.

#!/bin/bash
IFS=,
while read num1 num2 num3 num4 num5
do
printf $num1"\n"
printf $num2"\n"
printf $num3"\n"
printf $num4"\n"
printf $num5"\n"
printf "\n"
done < "$1"

Isso me dá a saída:

keismbp13b:tmp$ ./ifs.sh list
1
2
3
4
5
keismbp13b:tmp$

Estou pensando que talvez tenha que usar o awk ou algo semelhante para separar a lista em novas linhas, mas estou curioso para saber se existe outra maneira.

Obrigado!

Eu também percebi logo após postar que eu poderia fazer isso

tr , "\n" < list

Existe alguma maneira de fazer isso sem separar a lista primeiro?

    
por Keith Shannon 18.08.2017 / 05:34

1 resposta

5

Como você apontou na sua pergunta, isso pode ser feito com o comando tr da seguinte forma:

tr ',' '\n' < infile

e aqui estão outras opções para fazer isso.

sed -e $'s/,/\\n/g' infile

Ou:

sed 's/,/\
/g' infile.txt

Ou em algumas implementações de sed , use:

sed 's/,/\n/g' infile

Ou via awk (se você não se importa com a última linha vazia):

awk -v RS=',' '1' infile

Ou em bash :

#!/bin/bash
while IFS='' read -r line; do 
    echo "${line//,/$'\n'}";
done < infile

Ou lendo para uma matriz e, em seguida, printf :

#!/bin/bash
while IFS=, read -a fields; do
    printf "%s\n" "${fields[@]}";
done < infile
  • considerando cada campo separado por vírgula como ..., 2 4, ... acima, senão você pode adicioná-lo a IFS de IFS=',' a IFS=', ' para imprimir em separado.
por 18.08.2017 / 06:20