Itérer sur un fichier en utilisant deux valeurs sur la même ligne

J’ai besoin de passer une série de valeurs de couples qui sont des arguments pour un logiciel c ++. J’ai donc écrit ce script:

while read randomNumbers; do lambda = $randomNumbers | cut -f1 -d ' ' mi = $randomNumbers | cut -f2 -d ' ' ./queueSim mm1-queue $lambda $mi done < "randomNumbers" 

où le premier argument est la première valeur de chaque ligne du fichier “randomNumbers” et le second de la deuxième valeur (bien sûr). J’ai un segfault et une “commande introuvable”.

Comment puis-je atsortingbuer à lambda et mi valus issus de la ligne et transmettre cette variable au logiciel c ++?

Il n’y a pas besoin de couper. Laissez lire séparer la ligne pour vous:

 while read lambda mi; do ./queueSim mm1-queue $lambda $mi done < randomNumbers 

Notez qu'il est également couramment utilisé en conjonction avec IFS pour diviser la ligne de saisie sur différents champs. Par exemple, pour parsingr /etc/passwd (un fichier avec des lignes séparées par des deux-points), vous verrez souvent:

 while IFS=: read username passwd uid gid info home shell; do ... 

Je recommanderais d’atsortingbuer les valeurs comme ceci:

 lambda=$(echo $randomNumbers | cut -f1 -d ' ') mi=$(echo $randomNumbers | cut -f2 -d ' ') 

la façon dont vous le faites, vous essayez en fait d’exécuter une commande nommée comme n’importe quel contenu actuel de $randomNumbers .

Edit: Une autre chose: comme vos colonnes sont délimitées par un caractère d’espacement, vous pouvez aussi simplement lire la ligne entière dans un tableau dont les éléments sont séparés par des espaces blancs. Une façon d’y parvenir est:

 columns=( $(echo "$randomNumbers" | grep -o "[^ ]*") ) ./queueSim mm1-queue ${columns[@]::2} 

La première ligne correspond à toutes les sous-chaînes qui ne contiennent aucun espace séparément et les place dans les columns du tableau. La deuxième ligne fait la même chose que celle correspondante dans votre implémentation: insérer les deux premières colonnes en tant que parameters. Puisque se fait avec le découpage en tranches: vous prenez le tableau entier ${columns[@]} , mais en sélectionnez une sous-séquence en appliquant la limite ::2 à droite, qui renvoie dans chaque élément de columns commençant par la gauche (position 0 ), qui n’est pas sur une position >=2 .