2012-12-18 3 views
1

J'ai un script csh dans lequel j'accède à plusieurs fichiers d'en-tête pour extraire les coordonnées xmin, ymin de diverses boîtes englobantes. Y at-il un moyen simple de trouver minx, maxx, miny maxy à partir d'un écho piped à quelque chose comme awk. Par exempleTrouver le plus grand/le plus petit des deux nombres

set minx=`echo $x1\t$x2 | awk {something}` 

set maxx = `echo $x1\t$x2 | awk {something else} 

Je doute awk est le meilleur chemin à faire et je ne sais pas ce qui est. Voici un peu de mon code:

set bb1 = `label_file -g "bounding box[0]" r$start_roi` 

@ bb1_x = $bb1[1] 
@ bb1_y = 1023 - $bb1[4] 
@ bb1_h = $bb1[4] - $bb1[2] 
@ bb1_w = $bb1[3] - $bb1[1] 

Cela renverra la xmin, la largeur de ymin et la hauteur d'une zone rectangulaire d'intérêt. Je vais modifier et répéter le code ci-dessus pour trouver les mêmes paramètres d'une deuxième région.

Ce que je voudrais alors faire est de trouver la xmin mondiale, ymin, xmax et ymax afin de définir un rectangle plus large qui englobe complètement le plus petit 2.

-à-dire ensemble xmin être le plus petit nombre de $ BB1 [1] et BB2 $ [1] ensemble Xmax plus de BB1 ​​$ [3] et BB2 $ [3]

etc

grâce

+2

N'utilisez pas 'csh', c'est dangereux http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/ –

+0

@BasileStarynkevitch +1 mais ITYM" N'utilisez pas csh _for scripting_ ". –

+0

Eh bien, 'zsh' est meilleur que' csh' pour une utilisation interactive ... donc même en tant que shell de connexion, 'csh' n'est plus bon. –

Répondre

3

Cette imprimera le min et max valeurs attribuées à un tuyau ou un fichier ou des nombres:

awk '{ 
    min = ($0 =< min ? $0 : min) 
    max = ($0 >= max ? $0 : max) 
} 
END { 
    print min, max 
}' 

Si ce n'est pas ce que vous voulez, fournissez des exemples d'entrées et de sorties attendues.

Vous vous rapprochez presque certainement de votre tâche plus large en analysant les fichiers en (c) shell et en invoquant awk pour faire de l'arithmétique. awk a été conçu pour analyser les fichiers texte.

EDIT: basé sur ce segment de code de votre question mise à jour:

set bb1 = `label_file -g "bounding box[0]" r$start_roi` 
@ bb1_x = $bb1[1] 
@ bb1_y = 1023 - $bb1[4] 
@ bb1_h = $bb1[4] - $bb1[2] 
@ bb1_w = $bb1[3] - $bb1[1] 

et en supposant "label_file" est une commande qui génère 4 numéros séparés par un espace, vous pouvez le faire comme:

label_file -g "bounding box[0]" "r$start_roi" | 
awk '{ 
    bb1_x = $1 
    bb1_y = 1023 - $4 
    bb1_h = $4 - $2 
    bb1_w = $3 - $1 
}' 

Vous dites que vous avez une deuxième région aussi. Supposons que "$ start_roi" soit l'argument de label_file qui change. Ensuite, vous pouvez faire quelque chose comme:

(label_file -g "bounding box[0]" "r$start_roi"; 
    label_file -g "bounding box[0]" "r$other_roi") | 
awk '{ 
    bb1_x[NR] = $1 
    bb1_y[NR] = 1023 - $4 
    bb1_h[NR] = $4 - $2 
    bb1_w[NR] = $3 - $1 
}' 

et à ce moment bbl_x [1] contiendra les valeurs X pour la boîte de start_roi alors que bbl_x [2] contiendra les valeurs X pour la boîte other_roi. Vous pouvez le voir avec:

(label_file -g "bounding box[0]" "r$start_roi"; 
    label_file -g "bounding box[0]" "r$other_roi") | 
awk '{ 
    bb1_x[NR] = $1 
    bb1_y[NR] = 1023 - $4 
    bb1_h[NR] = $4 - $2 
    bb1_w[NR] = $3 - $1 
} 
END { 
    for (i=1; i<=NR; i++) { 
     print i, bbl_x[i], bbl_y[i], bbl_h[i], bbl_w[i] 
    } 
}' 

Si vous avez besoin d'aide pour déterminer ce qu'il faut faire à partir de là, laissez-nous savoir.

+0

Je viens de cueillir de l'air parce que je suis incertain sur la meilleure façon d'accomplir la tâche. Je vais éditer la question pour mieux souligner ce dont j'ai besoin – moadeep

+1

@moadeep Vous m'avez mal compris - d'après le peu que vous nous avez dit jusqu'ici, awk est le bon outil mais pour tout le script au lieu d'utiliser csh pour la majeure partie du script et juste appeler awk de temps en temps. –

+0

Merci pour votre aide.Votre solution est géniale. La raison pour laquelle j'utilise csh est que la plupart des logiciels de traitement d'image que nous utilisons sont basés sur csh et c et donc pour maintenir la cohérence, la plupart de nos scripts ont été écrits dans csh. Nous avançons lentement vers perl – moadeep

Questions connexes