awk ou sed, move a primeira coluna para terminar?

3

Eu tenho um arquivo de texto separado por espaço da seguinte maneira. Preciso reorganizar as colunas para que a primeira coluna esteja no final de cada linha.

Eu tenho uma ideia de como isso pode ser feito usando cut -d' ' f1 , mas estou pensando se há uma maneira fácil com awk ou sed .

Arquivo de texto:

™️       trade mark
ℹ️       information
↔️..↙️    left-right arrow..down-left arrow
↩️..↪️    right arrow curving left..left arrow curving right
⌚..⌛    watch..hourglass done
⌨️       keyboard
⏏️       eject button
⏩..⏳    fast-forward button..hourglass not done
⏸️..⏺️    pause button..record button
Ⓜ️       circled M
▪️..▫️    black small square..white small square
▶️       play button
◀️       reverse button

Deseja que a lista de símbolos siga a descrição.

    
por Philip Kirkbride 21.08.2017 / 16:16

4 respostas

7

Use sed

sed 's/\([^ ]*\) *\(.*\)/ /' infile

Esse \([^ ]*\) corresponderá a tudo até que um caractere não espacial seja visto.
Os parênteses \(...\) são usados para fazer um grupo correspondente, cujo índice seria .

O \(.*\) corresponde a tudo depois do primeiro grupo e está indexado em .
Os grupos * in \(...\) *\(...\) fora de correspondência serão ignorados para imprimir na saída, o que corresponde aos espaços entre os grupos 1 e 2, você pode usar \s* (com GNU sed ) ou [[:space:]]* (padrão) para coincidir com qualquer espaçamento caracteres em vez de apenas ASCII SPC também.

Então, no final, primeiro estamos imprimindo grupo2 do que grupo1 com um espaço entre eles.

    
por 21.08.2017 / 16:21
3
awk '{ printf "%s ",$NF;for (i=2;i<=NF-1;i++) { printf " %s",$i } printf "\n" }' filename

Com awk, $ NF indicará o último dado. Imprima isso e, em seguida, faça um loop pelos outros campos de 2 para um, mas o último campo, imprimindo esses.

    
por 21.08.2017 / 16:20
3
awk '{first = $1; $1=""; print $0, first}' file.txt

Armazene a primeira coluna em uma variável, escreva em branco na primeira coluna, imprima a linha inteira ( $0$ é a linha inteira, agora com a primeira coluna em branco) seguida da primeira coluna.

    
por 22.08.2017 / 00:17
2

com o Perl:

perl -pe 's/(\S+)(\s+)(.*)/$3$2$1/' file

(\S+) captura todos os caracteres que não são espaços em branco desde o início

(\s+) captura todos os espaços em branco seguindo os caracteres capturados

(.*) captura todo o resto até o final da linha

$3$2$1 inverte os 3 padrões correspondentes

    
por 21.08.2017 / 23:11