Eu tenho um arquivo de texto que tem o seguinte formato e quero adicionar uma linha vertical após essas linhas, seguida de números crescentes:
c4-1 d e c
c d e c
e-2 f g2
e4 f g2
g8-4\( a-5 g f\) e4 c
g'8\( a g f\) e4 c
c-1 r c2
c4 r c2
Eu alcanço a linha e a numeração com o seguinte while-loop
:
#!/bin/bash
while read -r line; do
if [ -z "$line" ]; then
echo
continue
fi
n=$((++n)) \
&& grep -vE "^$|^%" <<< "$line" \
| sed 's/$/\ \|\ \%'$(("$n"))'/'
done < file
e obtenha uma saída como:
c4-1 d e c | %1
c d e c | %2
e-2 f g2 | %3
e4 f g2 | %4
g8-4\( a-5 g f\) e4 c | %5
g'8\( a g f\) e4 c | %6
c-1 r c2 | %7
c4 r c2 | %8
agora eu quero que a adição seja alinhada verticalmente e obtenha uma saída como esta:
c4-1 d e c | %1
c d e c | %2
e-2 f g2 | %3
e4 f g2 | %4
g8-4\( a-5 g f\) e4 c | %5
g'8\( a g f\) e4 c | %6
c-1 r c2 | %7
c4 r c2 | %8
isso significaria que eu preciso de alguma forma obter o comprimento da linha mais longa (aqui: 21 caracteres) e o comprimento da linha de cada linha e adicionar a diferença com espaços, como eu poderia conseguir isso?
Você pode imprimir as linhas sem alinhamento e formatar a saída com
column -t
um caractere delimitador fictício:Aqui, adicionei um
@
caractere fictício antes de|
indicar o final da coluna. Osed
comando no final é usado para remover um caractere de espaço adicional antes do|
. A opção-e
é necessária para manter linhas vazias na saída.Resultado:
Usando
awk
+ GNUwc
assumindo que todos os caracteres na entrada são de largura única:Bash simples: funciona com a versão bash >= 4.0
Para versões mais antigas do bash, substitua mapfile por um loop while-read: isso funciona com a versão 3.2
apenas para os registros: (isso é terrivelmente lento, mas foi minha primeira tentativa usando
wc -L
)definitivamente indo para a resposta de @Freddy usando
column
!embora esteja trabalhando com um espaço adicional:
Supondo que não haja
@
caracteres nos dados (apenas substitua os dois@
usados aqui por outro caractere nesse caso):Isso usa a string
@| %
como separador de campo de saída e imprime a entrada seguida pelo número da linha de cada linha (separada por esse separador), depois usacolumn
para alinhar isso nos@
caracteres (estes serão removidos).Se você gosta de
sed
ou de expressões regulares estranhas, você sempre pode numerar as linhas comcat -n
ounl -b a
e, em seguida, mover os números de linha para o final da linha e inserir@| %
usandosed
, antes de chamarcolumn
:Usando
awk
para ler seu arquivo duas vezes, uma vez para descobrir o comprimento máximo da linha (m
) e novamente para formatar as linhas para esse comprimento.column
não é usado aqui (ou na última solução):Observe que o nome do arquivo é fornecido duas vezes na linha de comando.
Igual ao anterior, mas armazenando o arquivo na memória como um array (
a
), e imprimindo-o de acordo com o maior comprimento de linha no final. O acesso ao disco é beneficiado pela diminuição do consumo de memória: