Como alinhar a saída múltipla de um comando em colunas

0

Estou desenvolvendo um programa que gera todos os dados necessários de vários arquivos em colunas. O problema é que meu programa não pode alinhar várias saídas em uma coluna limpa.

Estas são as funções do meu programa:

#!/bin/sh

function findFile
{
    while read -r LINE
    do
            find . -name "${LINE}" | grep "${LINE}" || echo "${LINE} not found"
    done < /path/to/fnames.txt > /path/to/Files.txt
}

findFile

function grepFile
{
    printf "ISA\t\tGS\tTrans\tSender ID\tReceiver ID\tINV PO Number\tASN PO Number\n"
    fmt="%-16s%-8s%-8s%-8s%-24s%-9s%-12s\n"
    while read -r LINE
    do
            gs=$(zgrep -oP 'GS.[^*]*.[^*]*.[^*]*.[^*]*.[^*]*.\K[\w\s\d]*' < $LINE | sort -u)
            isa=$(zgrep -oP 'ISA.[^*]*.[^*]*.[^*]*.[^*]*.[^*]*.[^*]*.[^*]*.[^*]*.[^*]*.[^*]*.[^*]*.[^*]*.\K[\w\s\d]*' < $LINE | sort)
            trans=$(zgrep -oP 'GE.\K[\w\s\d-]*' < $LINE | sort -u)
            sender=$(zgrep -oP 'ISA.[^*]*.[^*]*.[^*]*.[^*]*.[^*]*.\K[\w\s\d-]*' < $LINE | sort -u)
            receiver=$(zgrep -oP 'ISA.[^*]*.[^*]*.[^*]*.[^*]*.[^*]*.[^*]*.[^*]*.\K[\w\s\d-]*' < $LINE | sort -u)
            bigponumber=$(zgrep -oP 'BIG.[\w\s\d-]*.[\w\s\d]*.[\w\s\d]*.\K[\w\s\d-]*' < $LINE | sort -u)
            asnponumber=$(zgrep -oP 'PRF.\K[\w\s\d-]*' < $LINE | sort -u)
            printf "$fmt" "${isa}" "${gs}" "${trans}" "${sender}" "${receiver}" "${bigponumber}" "${asnponumber}"
    done < /path/to/Files.txt
    rm /path/to/Files.txt
}

grepFile

saída: Observe os números que estão preenchendo o lado esquerdo da tela? Esses são os números PO.

ISA             GS      Trans   Sender ID       Receiver ID     INV PO Number   ASN PO Number
100000107       1107    1       2035735845         AMAZON                       2IJW4EUG
100000018       1018    1       00116520M      5032337598                       0082313829
100000096       1096    7       001165208      6111470100                       0026-7684347-0551
0026-7684347-0557
0026-7684347-0580
0026-7684347-0587
0026-7684347-0589
0026-7684347-3803
0026-7684347-3804
100000580       1580    6       2035735845     TGTDVS                           1310548379
1310570020
1310590953
1310596065
1310598477
1310609258

Eu quero que seja assim: O mesmo vale para os números PO INV

ISA             GS      Trans   Sender ID       Receiver ID     INV PO Number   ASN PO Number
100000107       1107    1       2035735845         AMAZON                       2IJW4EUG
100000018       1018    1       00116520M      5032337598                       0082313829
100000096       1096    7       001165208      6111470100                       0026-7684347-0551
                                                                                0026-7684347-0557
                                                                                0026-7684347-0580
                                                                                0026-7684347-0587
                                                                                0026-7684347-0589
                                                                                0026-7684347-3803
                                                                                0026-7684347-3804
100000580       1580    6       2035735845     TGTDVS                           1310548379
                                                                                1310570020
                                                                                1310590953
                                                                                1310596065
                                                                                1310598477
                                                                                1310609258
    
por WashichawbachaW 27.07.2017 / 10:37

2 respostas

2

Você pode fazer isso conforme mostrado:

grepFile | column -t -s $'\t' -o $'\t'

Contanto que a função grepFile tenha sido modificada de acordo com minhas sugestões, conforme determinado.

Crie mais uma função definida pelo usuário, por exemplo, "alignCols" e passe a saída da função "grepFile" para ela.

Além disso, modifique um pouco a função "grepFile" na instrução printf :

function grepFile
{

    #*************** ADD THIS ********
    t=$'\t'; # TAB char
    #*********************************

    printf "ISA\t\tGS\tTrans\tSender ID\tReceiver ID\tINV PO Number\tASN PO Number\n"

    #*************** MODIFY THIS ********
    fmt="%s\t%s\t%s\t%s\t%s\t%s\t%s\n"
    #*********************************

    while read -r LINE
    do
     # ... keep the other statements just like before #

     # ************** MODIFY printf ****************
     printf "$fmt" \
        "${isa:-$t}"         \
        "${gs:-$t}"          \
        "${trans:-$t}"       \
        "${sender:-$t}"      \
        "${receiver:-$t}"    \
        "${bigponumber:-$t}" \
        "${asnponumber:-$t}";
     # *********************************************

    done < /path/to/Files.txt
    rm /path/to/Files.txt
}

function alignCols
{
sed -e '
1i\
.TS\
tab('$'\t'');\
l l l l l l l.
$a\
.TE
' - | tbl - | nroff -Tascii -ms | grep .
}

# And then...

grepFile | alignCols

Resultados

ISA         GS     Trans   Sender ID    Receiver ID   INV PO Number   ASN PO Number
100000107   1107   1       2035735845   AMAZON                        2IJW4EUG
100000018   1018   1       00116520M    5032337598                    0082313829
100000096   1096   7       001165208    6111470100                    0026-7684347-0551
                                                                      0026-7684347-0557
                                                                      0026-7684347-0580
                                                                      0026-7684347-0587
                                                                      0026-7684347-0589
                                                                      0026-7684347-3803
                                                                      0026-7684347-3804
100000580   1580   6       2035735845   TGTDVS                        1310548379
                                                                      1310570020
                                                                      1310590953
                                                                      1310596065
                                                                      1310598477
    
por 27.07.2017 / 12:20
1

A chave aqui é usar o programa da coluna cf. coluna man 1

Ele permitirá que você alinhe seus dados conforme necessário por meio de algumas opções simples, como definir um separador

Você também pode dar uma olhada nesta pergunta: Formatar listas com o comando de coluna em * nix

    
por 27.07.2017 / 10:50