Awk para remover espaço extra após a primeira letra?

1

Awk para remover espaço extra após a primeira letra?

Our file contains:

Blue    sky.    Nice       weather.
    White cloud.    Bright    sun.
        Cool air. Bla    bla          bla.

How to have the content like this:

Blue sky. Nice weather.
    White cloud. Bright sun.
        Cool air. Bla bla bla.

Este comando, awk '{$1=$1} 1' file , remove todos os espaços extras.
Mas só precisamos remover o espaço extra após a primeira letra.

Alguém sabe?
Agradecemos toda sua atenção!

    
por user62359 02.01.2018 / 23:54

3 respostas

1

Com o GNU awk você pode fazer:

awk '{match($0,/(^[ ]+)/,arr)}; {$1=$1;printf("%s%s\n", arr[1], $0)}' 

match($0, /(^[ ]+)/, arr) Capture os espaços à esquerda da linha.
$1=$1 remove todos os espaços iniciais e repetidos.
printf("%s%s\n", a[1], $0)} adiciona novamente os espaços iniciais e imprime.

    
por 03.01.2018 / 03:16
2

Se você estiver executando o Linux e tiver o GNU Sed, poderá usar o sinalizador g juntamente com um número para o comando s ubstitute:

sed -r 's/ +/ /g2' file.txt

Para citar info sed :

 Note: the POSIX standard does not specify what should happen when
 you mix the 'g' and NUMBER modifiers, and currently there is no
 widely agreed upon meaning across 'sed' implementations.  For GNU
 'sed', the interaction is defined to be: ignore matches before the
 NUMBERth, and then match and replace all matches from the NUMBERth
 on.

Mas como em um caso você quer fazer a substituição na primeira instância de um espaço (quando não há espaços à esquerda), a resposta completa (com o GNU Sed) é:

sed -r 's/^/ /;s/ +/ /g2;s/^ //' file.txt

Em outras palavras, adicione um espaço inicial a todas as linhas, depois "esprema" todas as instâncias de espaços consecutivos, exceto a primeira, e remova o espaço inicial adicionado.

Se os espaços iniciais forem sempre um múltiplo de 8, você poderá usar o seguinte comando compatível com POSIX:

unexpand file.txt | sed 's/  */ /g' | expand

Ou mais simplesmente:

unexpand file.txt | tr -s ' ' | expand
    
por 03.01.2018 / 01:15
0

Aqui está uma maneira do KISS de fazer isso em awk , eu acho:

{tmp = substr($0,1,match($0,/[^ \t]/)-1); $1=$1; print tmp""$0}

Ex.

$ awk '{tmp = substr($0,1,match($0,/[^ \t]/)-1); $1=$1; print tmp""$0}' file
Blue sky. Nice weather.
    White cloud. Bright sun.
        Cool air. Bla bla bla.
    
por 03.01.2018 / 03:13