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:
.
à 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