En boucle à travers csv

J’écris un script shell bash et j’ai du mal à séparer stdout csv, puis à le parcourir en boucle.

Je reçois des données de stdout d’une firebase database. Il est délimité par des virgules et chaque ligne est sur sa propre ligne. Je stocke cela dans une variable appelée csv. J’ai la même chose pour ma variable de données. Je reçois ces données de stdout à partir d’une URL qui renvoie csv … encore une fois, elle est délimitée par des virgules et chaque ligne a sa propre ligne.

En dessous de \ n signifie que c’est une nouvelle ligne.

Je sais comment parcourir et obtenir n’importe quelle colonne pour csv en utilisant la lecture (voir ci-dessous). Donc, quand je fais écho à $ col1, il affiche deux résultats, ce que j’attends.

C’est ce que je ne comprends pas: je veux alors obtenir pour chacun des $ col1 je veux voir si $ col1 est égal à l’une des données de la première colonne de la variable $ data. S’il existe (il devrait toujours exister sauf en cas de problème), ajoutez $ col1 de csv à toutes les données de la variable de données pour append ces données afin de former un csv stdout.

csv=$("csv",123\n"csv2",456) data=$("data1",123\n"data2",456) echo "$csv" | while IFS=',' read -r col1 col2;do echo "$col1" done 

exemple de ce qui est nécessaire:

 if $csv[$col1] == [any of the values of $data[$col1]] then; echo $csv[$col1],$data[all of it] 

Je vais reformater vos données en:

LES DONNÉES

  Col #1 Col #2 ===== ==== data1 123 data2 456 

CSV

  Col #1 Col #2 ==== ==== csv 123 csv2 456 

Ai-je cette configuration correctement? Je sais que ce seront des fichiers CSV, mais je veux m’assurer de bien comprendre votre structure de données.

Maintenant vous avez dit:

Je veux obtenir pour chaque $ col1 je veux voir si $ col1 est égal à l’une des données de la première colonne de la variable $ data.

Vous voulez faire correspondre la colonne 1 de DATA avec la colonne 1 de CSV . Dans votre jeu, les deux colonnes n ° 1 des deux jeux ne correspondent pas. Vouliez-vous dire colonne 2?

Je suppose que vos résultats finaux devraient ressembler à ceci:

LES DONNÉES

 CVS Value Col #1 Col #2 ========= ====== ====== csv data1 123 csv2 data2 456 

(mais en format csv, bien sûr).

Est-ce correct?

Si vous avez une version assez moderne de BASH, vous pouvez utiliser des tableaux associatifs. Cela vous permet d’avoir le concept d’une clé égale à une valeur .

Disons que vous créez un tableau associé à la fois avec DATA et CSV où le tableau est indexé par la colonne n ° 2, vous pouvez alors parcourir un tableau et déterminer s’il existe une valeur correspondante et sortir les données comme vous le souhaitez.

Vous pouvez définir une valeur de tableau associatif par ceci:

 my_array[key]="value" 

Vous pouvez obtenir la valeur associée à la clé comme ceci:

 echo "${my_array[key]}" 

Vous pouvez obtenir une liste de toutes les valeurs comme celle-ci:

 echo "${my_array[*]}" 

Vous pouvez obtenir toutes les clés comme ceci:

 echo "${my_array[@]}" 

Voici un programme rapide et sale. Vous voulez probablement que quelque chose vérifie que vous ne disposez pas de clés en double lorsque vous créez votre tableau, et qu’une clé particulière est associée à une valeur lorsque vous imprimez votre tableau:

 #! /bin/bash csv="csv,123 csv2,456" data="data1,123 data2,456" # Create the Data Array Hash keyed by Col #2 while IFS="," read -r col1 col2 do data_array[$col2]=$col1 done <