[sh] utilisation d'un script awk dans un sh

Résolu/Fermé
Nebbb - 10 janv. 2011 à 19:24
 Nebbb - 10 janv. 2011 à 23:31
Bonjour,

J'ai un script awk qui traite un fichier tsv. En l'appelant avec cette commande :
cat ../donnee/geolocalisation.tsv | ./communesVoisines.awk -vLONGITUDE=45.343432 -vLATITUDE=-12.232321 | sort | head -5
je récupère ainsi 5 lignes sous cette forme :
0.0368543 014-327
0.0383347 014-437
0.0390129 014-271
0.0391931 014-242
0.0424154 014-383

J'aimerais récupérer ce résultat dans un script shell et pouvoir différencier les 2 champs qui compose chaque ligne.

J'ai beaucoup cherché et j'en viens à me demander si c'est possible ou non...


A voir également:

4 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
10 janv. 2011 à 19:29
Salut,

Tout dépend de comment seront exploités chacun des 2 champs par la suite...
Expliques-nous ce que tu veux en faire exactement par la suite, ce sera plus simple ;-)
0
En fait pour chaque sortie du type 0.0368543 014-327, j'ai besoin de récupérer et de stocker le deuxième champs ( 014-327 ) pour le mettre en paramètre d'un 3eme script...
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
10 janv. 2011 à 22:50
Là encore tout dépend comment doit être passé le paramètre ? Tout seul ? Groupé ?

Voilà déjà une façon de récupérer chaque deuxième champ avec une boucle :

$ cat fich
0.0368543 014-327
0.0383347 014-437
0.0390129 014-271
0.0391931 014-242
0.0424154 014-383

$ while read line; do echo "${line#* }";done < fich
014-327
014-437
014-271
014-242
014-383

$

Pour récupérer le 1er il suffit de changer "${line#* }" par "${line% *}"
;-))
0
C'est comme ça aussi que je pensais faire mais je ne peux pas faire simplement un done < fich, j'ai besoin de plusieurs pipes et de passer des paramètres dans la commande pour obtenir ceci : 0.0368543 014-327

Il faudrait que je fasse quelques chose dans ce genre là :
while read line; do echo "${line#* }";done < cat ../donnee/geolocalisation.tsv | ./communesVoisines.awk -vLONGITUDE=45.343432 -vLATITUDE=-12.232321 | sort | head -5

Mais évidemment ça ne fonctionne pas...

Sinon pour le 3eme script, je passe mon argument simplement comme ça :
echo -e $variable | ./population.awk
ici $variable est sensée être "014-327"...

J'espère que c'est plus clair, en tout cas je te remercie profondément de t'intéresser à mon problème Zipe
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
10 janv. 2011 à 23:14
Essaies comme ça :

while read line; do \
./population.awk  <<<"${line#* }" \
done < <(cat ../donnee/geolocalisation.tsv | ./communesVoisines.awk -vLONGITUDE=45.343432 -vLATITUDE=-12.232321 | sort | head -5)
0
Et bien je n'ai plus qu'à te tirer mon chapeau à te dire un grand merci !
Ça marche au poil !

par curiosité, qu'est ce que veux dire exactement ce "< <" ?
et j'imagine que <<< est une sorte de | inversé...

Encore merci beaucoup.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
10 janv. 2011 à 23:29
< <(commande1 | commande2)
ou
< $(commande1 | commande2)

Sont 2 syntaxes de redirection pour passer des commandes via ce genre de boucle.

Quant à <<< "${VAR}" c'est une façon de passer une variable en entrée à une commande.
0
Ah ok, merci beaucoup pour ton aide.
0