4 votes

aligner les colonnes à droite

Pour la commande Shell, existe-t-il un programme commun tel que column qui a une option pour aligner des colonnes spécifiques ou toutes les colonnes vers la droite, si ce n'est pas aussi détecter les champs numériques et le faire automatiquement pour ceux-ci ?

Sinon, quelle serait la manière la plus concise d'utiliser les commandes de traitement de texte ?

Exemple d'entrée délimitée par des espaces et déjà acheminée par pipeline | column -t :

TVN         20120419  10.08  10.08  9.15   9.6    1630000  9.17    20120419  4.6      83.88   7376600    -0.21858
INTEGERPL   20120419  143.1  148.9  140.3  142.5  2910     138.53  20120405  4.32503  5.55    1642500    1.26158
JSW         20120419  93.55  94.4   91.25  92.7   116000   90.07   20120329  3.86997  8.54    13155770   1.29315
KERNEL      20120419  73.7   74.9   72.9   74.1   56200    71.8    20120404  3.48432  10.71   2819790    1.50892
EUROCASH    20120419  39.49  41.99  39.01  40.73  812000   38.05   20120328  4.85095  20.21   5280548    2.46091
PEKAO       20120419  145.9  147.8  144.0  145.5  292000   140.2   20120404  3.70615  5.48    68858748   2.63889
PKNORLEN    20120419  38.0   38.5   37.25  37.35  1230000  36.26   20120329  4.15476  21.21   104607200  2.65772

On notera des problèmes de lisibilité, notamment lorsque les différences entre les enregistrements sont de plusieurs ordres de grandeur (comme dans l'avant-dernière colonne). Par ailleurs, le formatage des prix pour qu'il y ait toujours N décimales est un problème à part entière. Mais j'ai utilisé la fonction OFMT="%.4f" pour cela.

5voto

lgarzo Points 18302

L'alignement et la détection des champs numériques peuvent être réalisés de la manière suivante awk programme.

{
    width=10;
    separator="|";

    for (i=1; i<=NF; i++) {
        if (match($i, /[-+]*[0-9]+[\.]*[0-9]*/)) {
            printf("%"width"s", $i);
        }
        else { 
            printf("%-"width"s", $i);
        }
        if (i == NF) printf("\n");
        else printf("%s", separator);
    }
}

Sauvegarder en tant que column.awk .

Pour tester son fonctionnement, essayez ce qui suit :

echo "abc -1.2 def 2 3 hij" | awk -f column.awk

Le résultat est le suivant :

abc       |      -1.2|def       |         2|         3|hij

Il y a 2 paramètres réglables à l'intérieur du .awk script :

  • la largeur : le champ par défaut avec (utilisé pour l'alignement)
  • séparateur : utilisé pour séparer les colonnes de sortie

0voto

Aaron Orr Points 11

awk 's printf devrait pouvoir le faire. Pour plus de détails, vous devez fournir plus d'informations sur le format d'entrée et le format de sortie (souhaité).

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X