Existe um comando ou conjunto de comandos que eu possa usar para alinhar horizontalmente as linhas de texto com um caractere arbitrário? Por exemplo, com uma lista de endereços de email, 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 elas exigem mais esforço para ler (por exemplo column -t -s "@" < file.txt
).
Antes:
[email protected]
[email protected]
[email protected]
Depois de:
[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 email, para facilitar a verificação visual.
fonte
@
símbolos?@
símbolos não devem ser um problema com endereços de email, mas o usuário deve poder selecionar qual instância de um caractere por linha será a "âncora" em torno da qual o outro texto está centralizado.@
símbolos são permitidos em endereços de e-mail, por exemplotom"@brossmann"@example.com
. Por isso perguntei o que deveria acontecer se houver vários@
símbolos :).@
símbolos não são permitidos em uma variedade de serviços de e-mail. É perfeitamente razoável esperar e-mails "normais" que se encaixem em um padrão mais rígido que o "real", a menos que você esteja lidando com dados brutos e não filtrados do usuário; nesse caso, é mais provável que você lide com linhas sem@
.Respostas:
NÃO Awk. Somente
sed
ecolumn
:Resultado:
Agora, pensando bem, isso é quase o mesmo que a solução da Sundeep, apenas parece mais curta / tem menos chamadas
sed
e também assume que isso@
acontece apenas uma vez em cada linha.fonte
column -ts@ input.txt | sed -r 's/([^ ]+)( *)\s\s/\2\1@/'
Na sua forma mais simples, você pode simplesmente imprimir o primeiro campo em uma largura de campo adequadamente grande, por exemplo
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.
fonte
cw=$(cut -d@ -f1 file | wc -L)
e depoisawk -v w="$cw" 'BEGIN{OFS=FS="@"} {$1 = sprintf("%*s", w, $1)} 1'
awk -F@ '{a[$1] = $2; w = length($1) > w? length($1) : w; next} END {for (i in a) printf("%*s%c%s\n", w, i, FS, a[i])}' INPUT-FILE.txt > OUT.txt
. Ele formatou bem o restante, mas faltam alguns dados.awk -F@ '{printf "%12s@%s\n", $1, $2}' input.txt
solução hacky, pressupõe muito sobre entrada de texto
fonte
Uma solução rápida em Python que usa o menor comprimento possível de preenchimento que alinha à direita todas as strings restantes do separador:
Uso:
fonte
Outra solução GNU
awk
+column
:A saída:
fonte
Isso também pode funcionar com a manipulação de strings do Bash.
Script Bash (4.x):
O resultado:
fonte