Quebra condicionalmente colunas em 2 linhas?

5

Eu tenho um arquivo no formato de:

 ⌚..⌛    watch..hourglass
 ⌨️       keyboard
 ⏏️       eject button

Onde algumas linhas contêm duas entradas. Eu quero quebrar linhas com 2 entradas em 2 linhas assim:

 ⌚       watch
 ⌛       hourglass
 ⌨️       keyboard
 ⏏️       eject button

Existe uma maneira rápida de fazer isso?

Meu script:

#!/usr/bin/env bash

wget -O output.txt http://www.unicode.org/Public/emoji/6.0/emoji-data.txt

sed -i '/^#/ d' output.txt                        # Remove comments                                                                                                          
sed -i 's/.*(//' output.txt                       # Remove columns not needed                                                                                               
sed -i 's|[(),]||g' output.txt                    # Remove brackets around emoji                                                                                         
sed -i 's/\(.*[^ ]\)[ ]*\(.*\)/ /' output.txt # Move first column to last                                                                         
sed -i '/^$/d' output.txt                         # Remove blank lines

Tentei responder @ RomanPerekhrest sobre o seguinte (resposta foi atualizada) :

 ↔️..↙️    left-right arrow..down-left arrow
 ↩️..↪️    right arrow curving left..left arrow curving right
 ⌚..⌛    watch..hourglass done
 ⌨️       keyboard

e funciona no relógio / ampulheta, mas não os acima (?)

    
por Philip Kirkbride 21.08.2017 / 17:16

3 respostas

4

UPDATE

Corrigido um problema com alguns emojis sendo seguidos pelo seletor de variação-16 , resultando em uma má formatação.

Veja a resposta do , para um script sed ainda mais otimizado!

sed

 sed '/.\.\./ s/\(.\)\.\.\(\S*\)\s*\(.*\)\.\./\t\n \t/'
    
por 21.08.2017 / 17:46
4

Outra versão sed , baseada na resposta do zeppelin, mas mais simples e alinhada - tomando cuidado para que o unicode não seja sempre um único caractere. Testado com gnu sed .

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

Saída:

 ↔️      left-right arrow
 ↙️      down-left arrow
 ↩️      right arrow curving left
 ↪️      left arrow curving right
 ⌚      watch
 ⌛      hourglass done
 ⌨️       keyboard
    
por 21.08.2017 / 18:39
3
Solução

awk :

awk -F'[[:space:]][[:space:]]+' '$1~/\S\.\.\S/ && $2~/\S\.\.\S/{ 
         split($1,a,/\.\./); split($2,b,/\.\./); 
         printf("%s\t%s\n%s\t%s\n",a[1],b[1],a[2],b[2]); next 
     }1' file
  • -F'[[:space:]][[:space:]]+' - separador de campos

  • $1~/\S\.\.\S/ && $2~/\S\.\.\S/ - se 2 campos contiverem .. como subitem separador

A saída:

↔️  left-right arrow
↙️  down-left arrow
↩️  right arrow curving left
↪️  left arrow curving right
⌚   watch
⌛   hourglass done
⌨️       keyboard
    
por 21.08.2017 / 17:37