Obtenez le premier nombre réel à partir d’une série de fichiers

J’essaie de prendre le premier numéro de chaque fichier.dat du formulaire:

5.01 1 56.413481000 -0.00063400 0.00095770 5.01 2 61.193808800 0.00102170 0.00078280 5.01 3 65.974136600 -0.00108170 0.00102620 5.01 4 70.754464300 0.00082490 0.00103630 

puis utilisez ce numéro ( 5.01 ) comme titre d’un fichier .png.

J’utilise un script bash et je connais la line=$(head -n 1 $f) commande line=$(head -n 1 $f) telle que trouvée dans une question ici, mais cela me prend la première ligne du fichier $f .

Dans ce cas également, l’espace dans la ligne est enregistré et le titre du fichier .png devient:

plot 5.01 1 56.413481000 -0.00063400 0.00095770.png

Il y a un moyen de ne prendre que 5.01 et d’avoir un titre de coupe pour l’insortinggue?

Merci à tous.

Je le ferais probablement avec perl :

 VAL=$( echo "$line" | perl -pe 's/^[^\d]+//g;s/[^\d\.].*$//' ) 

Quelque chose comme ça de toute façon.

Devrait supprimer:

  • tout ce qui n’est pas un chiffre du début de la ligne.
  • Tout ce qui n’est pas un chiffre ou pas . à la fin de la ligne.

Ou avec grep:

 grep -o "[0-9]*\.[0-9]*" file.dat | head -1 

Edit: Tester sans la tête -1 pour une entrée en ligne:

 echo " 5.01 2 61.193808800 0.00102170 0.00078280" | grep -o "[0-9]*\.[0-9]*" 5.01 61.193808800 0.00102170 0.00078280 

Utiliser la tête -1 renverra le premier match sur la première ligne.

Quand vous savez que le match sera sur la première ligne, peut-on ignorer les fichiers avec une première ligne incorrecte (et ne pas parcourir les fichiers complets): Créez un monstre à deux têtes:

 head -1 | grep -o "[0-9]*\.[0-9]*" file.dat | head -1 

Pour extraire le premier champ, en supposant qu’ils soient séparés par des tabulations:

 val=$(head -n 1 $f | cut -f 1) 

ou, s’ils sont séparés par un espace, à la place:

 val=$(head -n 1 $f | cut -f 1 -d ' ') 

OU vous pouvez éviter d’appeler des processus supplémentaires et conserver toutes les manipulations de données dans le shell bash avec

  while read realNum restOfLine ; break done < $f echo $realNum 

Cela saisit le premier "mot" et place le rest dans "restOfLine". La break garantit que vous ne lisez que la première ligne du fichier.

IHTH