web-dev-qa-db-fra.com

Script shell pour analyser un fichier (csv) et traiter ligne par ligne

Salut Besoin d'un script shell pour analyser le fichier csv - ligne par ligne puis champ par champ] 

le fichier ressemblera à ceci

X1,X2,X3,X4
Y1,Y2,Y3,Y4

J'ai besoin d'extraire chacun de ces X1, X2 ....

J'ai écrit un script mais il échoue si la ligne dépasse une ligne.

14
Balualways

Voici comment je le ferais.

Tout d’abord, j’ai défini la variable d’environnement IFS pour indiquer à read que "," est le séparateur de champ.

export IFS=","

Étant donné le fichier "input" contenant les données que vous avez fournies, je peux utiliser le code suivant:

cat test | while read a b c d; do echo "$a:$b:$c:$d"; done

Pour récapituler rapidement ce qui se passe ci-dessus. cat test | lit le fichier et le redirige vers while. while exécute le code entre do et done pendant que read renvoie true. read lit une ligne à partir de l'entrée standard et la sépare en variables ("a", "b", "c" et "d") en fonction de la valeur de $ IFS. Enfin, echo n'affiche que les variables lues.

Ce qui me donne la sortie suivante

X1:X2:X3:X4
Y1:Y2:Y3:Y4

BTW, le BASH manuel est toujours une bonne lecture. Vous apprendrez quelque chose de nouveau chaque fois que vous le lirez.

36
Martin Olsen

Depuis que eykanal a mentionné AWk et et sed, je pensais montrer comment vous pouvez les utiliser.

awk -F, 'BEGIN{OFS="\n"}{$1=$1; print}' inputfile

ou

sed 's/,/\n/' inputfile

Ensuite, un script Shell pourrait traiter leur sortie:

awk_or_sed_cmd | while read -r field
do
    do_something "$field"
done

Bien sûr, vous pouvez effectuer le traitement dans le script AWK:

awk -F, '{for (i=1;i<=NF;i++) do_something($i)}' inputfile
3
Dennis Williamson

ls -l

vi fichier.sh

#! bin/sh

echo "INPUT PATTERN"

chat> test (saisir les données et les sauvegarder)

test de chat | en lecture (entrée); (ex: "$ a: $ b: $ c: $ d");

terminé

echo "motif affiché comme" $ ​​a: $ b: $ c: $ d "\ n"

sortie (0;);

0
kiran