Extraire la valeur de la colonne d’une ligne (variable)

Ok, donc j’ai une variable ($ line) qui est définie dans le script bash / shell comme

$line = "abc:123:def:345" 

besoin d’obtenir cette colonne2 = “123”

Comment puis-je extraire la valeur de la 2ème colonne, par exemple “123” et la nommer comme une variable différente pouvant être additionnée ultérieurement? Je sais que vous devez le séparer en fonction du délimiteur ‘:’ mais je ne sais pas comment transférer dans une variable différente en prenant une entrée de la variable de ligne $. Je ne le demande que parce que, pour une raison étrange, mon code lit la première ligne du fichier texte, MAIS n’exécute pas le awk sur la première ligne , donc la sum est incorrecte.

 FILE=$1 while read line do awk -F: '{summation += $3;}END{print summation;}' done < $FILE 

-code via un script shell

Merci.

Pour assigner une variable dans le shell, pas de $ du côté gauche, pas d’espaces autour des = , et < et > ne sont pas des guillemets valides

 line="abc:123:def:345" 

En bash, vous feriez ceci:

 IFS=: read -ra fields <<< "$line" 
  • régler temporairement IFS sur un deux-points
  • utilisez la variable $line en entrée de la commande read (une chaîne ici )
  • et lisez les valeurs dans le tableau de fields .

Les tableaux Bash sont indexés à partir de zéro, donc pour extraire le 2ème champ:

 echo "${fields[1]}" # => 123 

Vous pouvez utiliser awk pour obtenir le deuxième champ:

 line="abc:123:def:345" 

 awk -F: '{print $2}' <<< "$line" 123 

chemin en bash en utilisant expr

 Line2=$(expr $line : "[^:]*:\([^:]*\)") 

ou si les champs sont toujours 3 caractères

 Line2=${line:4:3}