AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 410051
Accepted
Tom Brossman
Tom Brossman
Asked: 2017-12-11 05:51:14 +0800 CST2017-12-11 05:51:14 +0800 CST 2017-12-11 05:51:14 +0800 CST

Como alinhar a lista a um caractere específico?

  • 772

Existe um comando ou conjunto de comandos que posso usar para alinhar linhas de texto horizontalmente a um caractere arbitrário? Por exemplo, com uma lista de endereços de e-mail, a saída produziria um arquivo de texto com todos os caracteres '@' alinhados verticalmente.

Para ter sucesso, acredito que um número variável de espaços vazios deve ser adicionado ao início da maioria das linhas. Não quero colunas separadas, pois exigem mais esforço para ler (por exemplo, column -t -s "@" < file.txt).

Antes da:

[email protected]
[email protected]
[email protected]

Depois:

   [email protected]
[email protected]
 [email protected]

Em outras palavras: posso especificar um caractere para ser um ponto de ancoragem, em torno do qual o texto ao redor é centralizado horizontalmente? Meu caso de uso para isso são endereços de e-mail, para torná-los mais fáceis de digitalizar visualmente.

text-processing command-line
  • 7 7 respostas
  • 2096 Views

7 respostas

  • Voted
  1. steeldriver
    2017-12-11T06:44:13+08:002017-12-11T06:44:13+08:00

    Na sua forma mais simples, você pode apenas imprimir o primeiro campo em uma largura de campo adequadamente grande, por exemplo

    awk -F@ 'BEGIN{OFS=FS} {$1 = sprintf("%12s", $1)} 1' file
             [email protected]
          [email protected]
           [email protected]
    

    AFAIK qualquer método que não assuma uma largura de campo máxima específica exigirá manter o arquivo na memória ou fazer duas passagens.

    • 11
  2. Sundeep
    2017-12-11T06:17:07+08:002017-12-11T06:17:07+08:00

    solução hacky, assume muito sobre o texto de entrada

    $ # four commas to reduce chance of it affecting actual email address
    $ sed 's/@/,,,,@/' ip.txt | column -t -s,,,,
    123     @example.com
    456789  @example.net
    01234   @something-else.com
    
    $ sed 's/@/,,,,@/' ip.txt | column -t -s,,,, | sed -E 's/^([^ ]+)( +)/\2\1/'
         [email protected]
      [email protected]
       [email protected]
    
    • 6
  3. David Foerster
    2017-12-12T01:29:00+08:002017-12-12T01:29:00+08:00

    Uma solução rápida do Python que usa o comprimento de preenchimento mais curto possível que alinha à direita todas as strings à esquerda do separador:

    #!/usr/bin/env python3
    import sys
    fieldsep = '@'
    records = [line.rstrip('\n').split(fieldsep, 1) for line in sys.stdin]
    col1_len = max((len(r[0]) for r in records), default=0)
    for r in records:
        print(r[0].rjust(col1_len), r[1], sep=fieldsep)
    

    Uso:

    python3 align-field.py < data.txt
    
    • 4
  4. Best Answer
    wvxvw
    2017-12-11T08:04:59+08:002017-12-11T08:04:59+08:00

    NÃO Ah! Apenas sede column:

    column -ts@ file.txt | sed -E 's/([^ ]+)([ ]+) (.+)/\2\1@\3/'
    

    Resultado:

       [email protected]
    [email protected]
     [email protected]
    

    Agora, pensando bem, isso é quase o mesmo que a solução do Sundeep, apenas parece mais curto / tem menos chamadas para sed, e também assume que isso @acontece apenas uma vez em cada linha.

    • 3
  5. RomanPerekhrest
    2017-12-11T07:45:27+08:002017-12-11T07:45:27+08:00

    Outra solução GNU awk+ column:

    awk '{ split($0,a,/ +/,sep); printf "%*s@%s\n",length($1 sep[1])-2,$1,$2 }' <(column -ts'@' file)
    

    A saída:

       [email protected]
    [email protected]
     [email protected]
    
    • 2
  6. zero2cx
    2017-12-11T20:19:59+08:002017-12-11T20:19:59+08:00

    Isso também pode funcionar com manipulação de string Bash.

    Script Bash (4.x):

    #!/bin/bash
    
    read -d '' -r -a data <"data.txt"
    
    for ((pos=0, i=0; i<${#data[@]}; i++)); do
        locl=${data[$i]%@*}                         # The local-part.
        [[ ${#locl} -gt $pos ]] && pos=${#locl}     # Determine the lengthiest $locl.
    done
    
    for ((i=0; i<${#data[@]}; i++)); do
        email=${data[$i]}
        locl=${email%@*}                            # The local-part.
        domain=${email#*@}                          # The email domain.
        printf '%*s@%s\n' $pos $locl $domain        # Align $locl to the right, at $pos.
    done
    

    O resultado:

       [email protected]
    [email protected]
     [email protected]
    
    • 2
  7. StackzOfZtuff
    2021-02-02T05:44:50+08:002021-02-02T05:44:50+08:00

    Tente columncom--table-right

    Aqui está a entrada sem qualquer formatação:

    $ echo -ne '[email protected]\[email protected]\[email protected]\n'
    [email protected]
    [email protected]
    [email protected]
    

    Aqui está uma primeira tentativa, que não faz exatamente o que queremos:

    $ echo -ne '[email protected]\[email protected]\[email protected]\n' |
    column --separator @ --table --output-separator @
    123   @example.com
    [email protected]
    01234 @something-else.com
    

    Aqui está uma outra tentativa. Mas desta vez com a --table-right 1opção adicionada. Isso alinha a coluna 1 à direita (as colunas começam em 1) e faz o que queríamos:

    $ echo -ne '[email protected]\[email protected]\[email protected]\n' | 
    column --separator @ --table --output-separator @ --table-right 1
       [email protected]
    [email protected]
     [email protected]
    

    Ou se preferir as opções curtas:

    echo -ne '[email protected]\[email protected]\[email protected]\n' |
    column -s@ -t -o@ -R1
       [email protected]
    [email protected]
     [email protected]
    
    • 0

relate perguntas

  • Reorganize as letras e compare duas palavras

  • Subtraindo a mesma coluna entre duas linhas no awk

  • Embaralhamento de arquivo de várias linhas

  • Pub / sub de linha de comando sem um servidor?

  • como posso alterar o caso do caractere (de baixo para cima e vice-versa)? ao mesmo tempo [duplicado]

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Matriz JSON para bash variáveis ​​usando jq

    • 4 respostas
  • Marko Smith

    A data pode formatar a hora atual para o fuso horário GMT? [duplicado]

    • 2 respostas
  • Marko Smith

    bash + lê variáveis ​​e valores do arquivo pelo script bash

    • 4 respostas
  • Marko Smith

    Como posso copiar um diretório e renomeá-lo no mesmo comando?

    • 4 respostas
  • Marko Smith

    conexão ssh. Conexão X11 rejeitada devido a autenticação incorreta

    • 3 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Marko Smith

    comando systemctl não funciona no RHEL 6

    • 3 respostas
  • Marko Smith

    rsync porta 22 e 873 uso

    • 2 respostas
  • Marko Smith

    snap /dev/loop em 100% de utilização -- sem espaço livre

    • 1 respostas
  • Marko Smith

    chave de impressão jq e valor para todos no subobjeto

    • 2 respostas
  • Martin Hope
    EHerman Matriz JSON para bash variáveis ​​usando jq 2017-12-31 14:50:58 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Drux A data pode formatar a hora atual para o fuso horário GMT? [duplicado] 2017-12-26 11:35:07 +0800 CST
  • Martin Hope
    AllisonC Como posso copiar um diretório e renomeá-lo no mesmo comando? 2017-12-22 05:28:06 +0800 CST
  • Martin Hope
    Steve Como as permissões de arquivo funcionam para o usuário "root"? 2017-12-22 02:46:01 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST
  • Martin Hope
    Cbhihe Altere o editor padrão para vim para _ sudo systemctl edit [unit-file] _ 2017-12-03 10:11:38 +0800 CST
  • Martin Hope
    showkey Como baixar o pacote não instalá-lo com o comando apt-get? 2017-12-03 02:15:02 +0800 CST
  • Martin Hope
    youxiao Por que os diretórios /home, /usr, /var, etc. têm o mesmo número de inode (2)? 2017-12-02 05:33:41 +0800 CST
  • Martin Hope
    user223600 gpg — o comando list-keys gera uid [ desconhecido ] depois de importar a chave privada para uma instalação limpa 2017-11-26 18:26:02 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve