|
F.A.Q. XSM
- Pourquoi le programme XSM s'appelle-t-il hxsm ?
- Problèmes communs d'activation de clé
- Dans un script, comment passer les noms de fichiers sous forme de variables ?
- Peut-on combiner des options en ligne de commande et un fichier paramètre ?
- Peut-on combiner FILE=n et noms de fichier statiques dans un fichier paramètre ?
- Combien de fichiers maximum peut-on traiter avec FILE=n, SORTOFn ?
- Dans un script, comment passer les paramètres de tri sous forme de variables ?
- Quand doit-on utiliser l'option KEEP_ORDER ?
- Dans un parmfile, les lignes d'instructions FIELDS, INCLUDE, EXCLUDE sont longues, peut-on les écrire sur plusieurs lignes ?
- Lorsque le fichier en entrée est vide, XSM fait une erreur XSM083E. Comment contourner ?
- Comment supprimer les informations écrites sur stderr ?
- Le séparateur de champs virgule '
FIELDSEP=,' provoque une confusion ; comment contourner ?
- Peut-on définir la ligne supprimée dans le cas d'un dédoublonage de fichier, par exemple prendre toujours la deuxième ?
- A quoi sert et comment fonctionne l'option Y2K ?
- Comment utiliser le multi-threading (XSM version 6) ?
- Peut-on utiliser XSM en réseau ?
- Comment désintaller XSM ?
REPONSES :
Pourquoi le programme XSM s'appelle-t-il hxsm ?
Pour ne pas induire de confusion avec le programme X11 Session Manager "xsm" d'UNIX

Problèmes communs d'activation de clé
XSM s'active avec une clé d'activation délivrée sur l'extranet XSM à partir d'un Serial Number.
Lorsque vous téléchargez/copiez XSM sur une nouvelle machine, XSM affiche son Serial Number
en passant les commandes :
./hhnsinst[VER] ./hxsm[VER] ( VER=version exemple: hhnsinst656 hxsm656)
./hxsm[VER]
Exemple :
[root@srv1 tmp]# ./hhnsinst656 hxsm656
Program 'hxsm656' successfully installed
[root@srv1 tmp]# ./hxsm656
Thanks for testing the 'HHNS Sort/Merge Program MultiPRO - V.6' Program
If you wish to register for the 'HHNS Sort/Merge Program MultiPRO - V.6' Product on THIS machine,
just contact HHNS with the following registration (serial number) key :
0013-3432-1505-M
For further informations : http://www.hhns.fr, email:support@hhns.fr
Please press Enter to continue...
Il faut alors générer sur l'Extranet une clé d'activation pour cette plateforme
(une plateforme = hostname + Operating System + Serial Number).
Puis activer XSM avec la clé d'activation obtenue, en passant la commande :
./hhnsinst[VER] ./hxsm[VER] cle_d_activation ( VER=version exemple: hhnsinst656 hxsm656)
Exemple :
[root@srv1 tmp]# ./hhnsinst656 hxsm656 1234-5678-9012-A
Program 'hxsm656' successfully installed
XSM est alors opérationnel. Lorsque vous le lancez sans aucun paramètre, il affiche son mode d'emploi.
Problèmes fréquents :
- Lorsque vous passez la commande
hhnsinst, vous n'indiquez pas le bon pathname du
programme XSM ; par exemple, vous n'êtes pas positionné sur le répertoire contenant XSM, ou
vous avez probablement mal tapé le nom du programme
- Vous avez plusieurs programmes XSM dans le PATH ; lorque vous appelez XSM, c'est une version
non activée qui se lance car elle est prioritaire dans le PATH
- [UNIX] Vous n'avez pas les droits R/W sur le programme hxsm. dans ce cas, le programme
d'installation
hhnsinst fait une erreur.
- Sur certains UNIX/Linux, il faut être superuser "root" pour passer les commandes d'activation.
- L'Extranet refuse de générer une clé car le Serial Number est déjà dans sa base :
Vérifiez que vous n'avez pas déjà déclaré une plateforme avec ce Serial Number.
Si oui, il suffit de reconduire la clé, pour obtenir une nouvelle clé d'ativation (30 jours).
Si non, contactez-nous.
- L'Extranet refuse de générer une clé d'activation car vous avez déjà généré 3 clés d'activation :
Contactez-nous.

Dans un script, comment passer les noms de fichiers sous forme de variables ?
a) Avec un parmfile (fichier contenant les paramètres), utiliser les variables d'environnement
SORTIN et SORTOUT associées au ordres INPFIL et OUTFIL :
myparm.xsm contient :
SORT FIELDS=(14,7,B,A)
RECORD RECFM=V,LRECL=200
INPFIL DD:SORTIN
OUTFIL DD:SORTOUT
Le script affecte les valeurs de SORTIN et SORTOUT avant l'appel à XSM :
export SORTIN=/a/b/c/myinputfile
export SORTOUT=/d/e/f/myoutputfile
# Windows: set SORTIN=/a/b/c/myinputfile
# Windows: set SORTOUT=/d/e/f/myoutputfile
hxsm myparm.xsm
b) En mode commande,
A=/a/b/c/myinputfile
B=/d/e/f/myoutputfile
# Windows: set A=/a/b/c/myinputfile
# Windows: set B=/d/e/f/myoutputfile
# Ancienne forme :
hxsm -rF -l180 -k14,10,A,C -o$B $A
# Windows: hxsm -rF -l180 -k14,10,A,C -o%B% %A%
# Nouvelle forme :
hxsm --recfm=F --lrecl=180 --key=14,10,A,C --infile=$A --outfile=$B
# Windows: hxsm --recfm=F --lrecl=180 --key=14,10,A,C --infile=%A% --outfile=%B%
# On peut aussi utiliser les redirections UNIX stdin et stdout :
hxsm --recfm=F --lrecl=180 --key=14,10,A,C < $A > $B
# Windows: hxsm --recfm=F --lrecl=180 --key=14,10,A,C < %A% > %B%
Nota Bene : XSM est plus performant si l'on spécifie le fichier en entrée car il peut déterminer
dynamiquement la valeur optimale STORAGE. Si l'on utilise le standard input, XSM ne peut pas
déterminer la taille du fichier en entrée et le STORAGE optimal.
Dans un parmfile, on ne peut utiliser DD:SORTIN que s'il n'y a qu'un seul fichier en entrée.
Autrement, il faut indiquer les noms de fichiers sous forme statique :
SORT FIELDS=(14,7,B,A)
RECORD RECFM=V,LRECL=200
INPFIL /a/b/c/myinputfile1
INPFIL /a/b/c/myinputfile2
INPFIL /a/b/c/myinputfile3

Dans un script, comment passer les paramètres de tri sous forme de variables ?
a) en mode commande, on suppose que le script a au préalable calculé les variables nécessaires
RECFM=...
LRECL=...
KEYS=...
hxsm --recfm=$RECFM --lrecl=$LRECL --key=$KEYS --infile=$A --outfile=$B
b) en construisant dynamiquement un fichier temporaire parmfile avant de lancer XSM
# Creation du parmfile temporaire
echo "
**** parmfile temporaire /tmp/myparm.$$ ****
SORT FIELDS=($start1,$len1,C,A,$start2,$len2,C,A)
RECORD RECFM=$recfm,LRECL=$lrecl
INPFIL $A
OUTFIL $B
" > /tmp/myparm.$$
# appel XSM
hxsm /tmp/myparm.$$
# suppression du temporaire si RC=0
if [ $? -eq 0 ] ; then rm /tmp/myparm.$$ ; fi
Nota : la méthode b) est recommandée pour faciliter la mise au point et la maintenance.

Peut-on combiner des options en ligne de commande et un fichier paramètre ?
Les options suivantes peuvent être ajoutées dans la commande :
-q, --quiet : quiet
-v, --verbose : verbose
-c, --check : don't sort, just checks that a previous result is correctly sorted
Les autres options qui définissent les noms de fichiers en entrée, en sortie, les clés de tri, les
options de tri, les fichiers temporaires peuvent être passés en mode commande à condition que ces
options ne figurent pas dans le parmfile.
Nota bene : le parmfile doit être le dernier paramètre de la commande.
Exemples :
Le parmfile ne contient que les clés de tri et le format des fichiers en entrée et en sortie ;
les noms de fichers sont indiqués dans la commande :
parmfile :
SORT FIELDS=(10,8,,C,A)
RECORD RECFM=F,LRECL=100
ligne de commande :
hxsm -v myparm.xsm < /a/b/c/myinputfile > /d/e/f/myoutputfile
Le parmfile contient les clés de tri, le format des fichiers, et le nom du fichier en entrée ;
le nom du fichier en sortie est indiqué dans la commande :
parmfile :
SORT FIELDS=(10,8,,C,A)
RECORD RECFM=F,LRECL=100
INPFIL /a/b/c/myinputfile
ligne de commande :
hxsm -v -o /d/e/f/myoutputfile myparm.xsm
Cet exemple de peut pas fonctionner : le fichier en sortie est spécifié à la fois en mode
commande et dans le parmfile !
parmfile :
SORT FIELDS=(10,8,,C,A)
RECORD RECFM=F,LRECL=100
INPFIL /a/b/c/myinputfile
OUTFIL /d/e/f/myoutputfile
ligne de commande :
hxsm -v -o /d/e/f/myoutputfile myparm.xsm

Peut-on combiner FILE=n et noms de fichier statiques dans un fichier paramètre ?
Non : dans un même parmfile, le ou les fichiers en sortie sont spécifiés par des ordres
OUTFIL nom_de_fichier
ou OUTFIL FILE=n
mais on ne peut pas combiner ces deux formes dans un même parmfile.
La forme OUTFIL FILE=n sert à indiquer des noms de fichiers qui ont été affectés par des variables
d'environnement SORTOFn.
Exemple :
parmfile :
SORT FIELDS=(3,3,CH,A,51,11,CH,A)
RECORD RECFM=F,LRECL=402
INPFIL /tmp/worldclients.inp
OUTFIL /tmp/clients.fr,INCLUDE=(19,3,CH,EQ,C'.fr')
OUTFIL /tmp/clients.uk,INCLUDE=(19,3,CH,EQ,C'.uk')
OUTFIL /tmp/clients.de,INCLUDE=(19,3,CH,EQ,C'.de')
ligne de commande :
hxsm -v myparm.xsm
équivalent à
parmfile :
SORT FIELDS=(3,3,CH,A,51,11,CH,A)
RECORD RECFM=F,LRECL=402
INPFIL /tmp/worldclients.inp
OUTFIL FILE=1,INCLUDE=(19,3,CH,EQ,C'.fr') # affeter la variable SORTOF1
OUTFIL FILE=2,INCLUDE=(19,3,CH,EQ,C'.uk') # affeter la variable SORTOF2
OUTFIL FILE=3,INCLUDE=(19,3,CH,EQ,C'.de') # affeter la variable SORTOF3
ligne de commande :
SORTOF1=/tmp/clients.fr
SORTOF2=/tmp/clients.uk
SORTOF3=/tmp/clients.de
hxsm -v myparm.xsm

Combien de fichiers maximum peut-on traiter avec FILE=n, SORTOFn ?
99 fichiers.
Nota #1 : la première variable SORTOFn est toujours SORTOF1
Nota #2 : l'ordre des variables doit être consécutif :
Correct :
SORTOF1=/tmp/clients.fr
SORTOF2=/tmp/clients.uk
SORTOF3=/tmp/clients.de
hxsm -v myparm.xsm
Incorrect :
SORTOF1=/tmp/clients.fr
SORTOF2=/tmp/clients.uk
SORTOF4=/tmp/clients.de
hxsm -v myparm.xsm
Nota #3 : Si cela n'est pas suffisant, signalez-le nous et nous augmenterons la valeur.

Quand doit-on utiliser l'option KEEP_ORDER ?
cf. tris desctuctifs et non-destructifs

Dans un parmfile, les lignes d'instructions FIELDS, INCLUDE, EXCLUDE sont longues, peut-on les écrire sur plusieurs lignes ?
Oui : on peut écrire une instruction sur plusieurs lignes à condition de terminer par une virgule.
Exemple :
SORT FIELDS=(011,003,CH,A,
001,010,CH,A,
015,114,CH,A,
014,001,CH,A)
RECORD RECFM=V,LRECL=263
EXCLUDE COND=(030,002,CH,EQ,C'L1',AND,
032,001,CH,EQ,C'1',
OR,
030,002,CH,EQ,C'L2',AND,
032,001,CH,EQ,C'2')
INPFIL DD:SORTIN
OUTFIL DD:SORTOUT
Nota : dans l'expression COND=, l'opérateur booléen 'AND' est proritaire sur l'opérateur 'OR'.
Vous pouvez rajouter des parenthèses pour une meilleure lisibilité :
EXCLUDE COND=((030,002,CH,EQ,C'L1',AND,
032,001,CH,EQ,C'1'),
OR,
(030,002,CH,EQ,C'L2',AND,
032,001,CH,EQ,C'2'))

Lorsque le fichier en entrée est vide, XSM fait une erreur XSM083E. Comment contourner ?
Que les données en entrées proviennent de stdin (standard input) ou d'un fichier nommé, XSM
attend des données à traiter.
S'il peut arriver dans un traitement régulier que le fichier en entrée soit vide, alors il
convient de tester ce fichier avant de lancer XSM. Cela est trivial en Shell UNIX :
#
# ... some step of a batch process ..
#
INPUT=/a/b/c/myinputfile
OUTPUT=/d/e/f/myoutputfile
# input file is size 0 or does not exists:
if [ -s $INPUT ] ; then
echo "input file is empty ; nothing to do !"
# if you need the output files anyway, then pretend they exist:
> $OUTPUT
# file is okay for processing:
else
hxsm --recfm=F --lrecl=180 --key=14,10,A,C --infile=$INPUT --outfile=$OUTPUT
fi
if [ $? -ne 0 ] ; then
echo "error in SORT step"
fi
Pour le batch command processor Windows "cmd.exe", cela necessite quelques outils "UNIX-like" ; Dans
notre cas 'test.exe', une implemantation Windows de l'utilitaire UNIX 'test'.
Nota: Perl est une bonne solution pour les scripts Windows (et facilement portable UNIX/Windows).
Rem
Rem ... some step of a batch process ..
Rem
set INPUT=C:\a\b\c\myinputfile
set OUTPUT=C:\d\e\f\myoutputfile
Rem input file is size 0 or does not exists:
test -s %INPUT%
if %ERRORLEVEL% 0 goto OK
goto KO
:KO
echo input file is empty ; nothing to do !
Rem if you need the output files anyway, then pretend they exist:
ver 1>nul 2>OUTPUT
goto NEXT
:OK
Rem file is okay for processing:
hxsm --recfm=F --lrecl=180 --key=14,10,A,C --infile=%INPUT% --outfile=%OUTPUT%
goto NEXT

Peut-on définir la ligne supprimée dans le cas d'un dédoublonage de fichier, par exemple prendre toujours la deuxième ?
Non, cela est impossible.

A quoi sert et comment fonctionne l'option Y2K ?
Le type Y ou Y2K indique qu'une clé de tri de type date contient des dates à la fois antérieures et
postérieures à l'an 2000. XSM utilise alors l'année 70 (1970) comme année pivot pour déterminer si
les dates sont du XXe ou du XXIe siècle.
Exemple :
120186 : 86 > pivot -> 12/01/1986
120271 : 71 > pivot -> 12/02/1986
120370 : 70 ≤ pivot -> 12/03/2070
120468 : 68 < pivot -> 12/04/2086
120507 : 68 < pivot -> 12/05/2007
120601 : 68 < pivot -> 12/06/2001
L'option Y2KSTART permet de choisir un autre pivot que 1970.
Exemple:
OPTION Y2KSTART=1930
SORT FIELDS=(11,2,Y2C,D,9,2,CH,D,7,2,CH,D,1,6,CH,A)
RECORD RECFM=V,LRECL=80
INPFIL clients.inp
OUTFIL clients.out

Le séparateur de champs virgule 'FIELDSEP=,' provoque une confusion ; comment contourner ?
En effet, dans l'exemple suivant, XSM interprète la virgule comme un séparateur d'instruction et
considère que le séparateur de champs est vide FIELDSEP=
SORT VFIELDS=(4,5,N,A,1,20,C,D),FIELDSEP=,
RECORD RECFM=V,LRECL=100
INPFIL clients.csv
OUTFIL clients.out
Indiquer alors les mots-clés suivants :
BAR = the '|' char
TAB = the Tabulation (X'09') char
COMMA = the ',' char
COLUMN = the ':' char
DIARESIS = the '#' char
SLASH = the '/' char
BACKSLASH = the '\' char
SEMICOLUMN
ou SEMI-COLUMN = the ';' char
SINGLEQUOTE
ou SINGLE-QUOTE = the "'" char
DOUBLEQUOTE
ou DOUBLE-QUOTE = the '"' char
ou indiquer la valeur hexadécimale : X'hh'
Exemples :
SORT VFIELDS=(4,5,N,A,1,20,C,D),FIELDSEP=COMMA
SORT VFIELDS=(4,5,N,A,1,20,C,D),FIELDSEP=X'2C'
Si FIELDSEP n'est pas indiqué dans un ordre SORT VFIELDS, sa valeur par défaut est la tabulation
(X'09').

Comment supprimer les informations écrites sur stderr ?
En utilisant l'option -q ou --quiet.
L'intérêt du mode "Quiet" par rapport à la redirection 2>/dev/null est que dans le premier cas seuls
les messages d'erreurs réels apparaitrons ; dans le second cas, tous les messages d'erreur seront
supprimés.
Utilisateurs Windows : la redirection s'écrit 2>NUL
Mode "Verbose" :
~/dev/ $ hxsm658 -v littlef.xsm
XSM056I HXSM V6.58 - (c) HHNS 1996-2006
XSM027I Initializing
XSM028I Reading
XSM073I 000000080 RECORDS PROCESSED, 000000080 so far. : 0 SEC.
XSM031I END OF JOB littlef.xsm 80 rec.: 1 SEC.
~/dev/ $
Mode normal :
~/dev/ $ hxsm658 littlef.xsm
XSM031I END OF JOB littlef.xsm 80 rec.: 0 SEC.
~/dev/ $
Mode "Quiet" :
~/dev/ $ hxsm658 -q littlef.xsm
~/dev/ $

Comment utiliser le multi-threading (XSM version 6) ?
Par défaut, XSM fonctionne en mono-thread et n'utilise qu'un seul processeur à un instant donné.
Si l'on déclare plusieurs sortworks (sous-entendu sur plusieurs disques différents), XSM fonctionnera
en multi-threading et délivrera les meilleurs performances. C'est le système d'exploitation qui
associe alors dynamiquement les threads aux processeurs disponibles ("processor bind").
Pour forcer le multi-threading, utiliser soit
OPTIONS PROCS=n
soit déclarer plusieurs sortworks (même si vous n'en avez pas plusieurs) :
SORTWORKS dir1,dir2[,dir3 ...]
Supposons par exemple que vous ayez une machine quadri-processeur, le plus interessant est de trouver
4 disques physiques différents pour les sortworks. Les I/O disques sont plus longues que les
traitements CPU, il n'est donc pas interessant d'exécuter XSM en multi-threading sur un même sortwork
(ou sur des sortworks du même dique physique) : en effet, les threads seront bloqués par des
contentions I/O disque et le résultat sera équivalent à un traitement mono-threading.

Peut-on utiliser XSM en réseau ?
Non : XSM ne fonctionne que sur le système sur lequel il a été activé. Un partage de disque contenant
le programme XSM vers une autre machine du réseau ne permet pas à cette autre machine d'utiliser XSM.
D'autre part, il est déconseillé pour des raisons de performances de trier depuis une machine des
fichiers sur des disques partagés d'une autre machine.
Dans certains cas, il peut être plus performant de compresser / copier / décompresser ces fichiers.
Cela dépend :
- des performances du réseau
- des performances des disques
- des performances du processeur.

Comment désinstaller XSM ?
UNIX: rm hxsm[numero_de_version] hhnsinst[numero_de_version]
Windows: del hxsm[numero_de_version] hhnsinst[numero_de_version]

|