divide a coluna após o n-ésimo caractere

3

Estou tentando dividir minha segunda coluna no arquivo abaixo a cada 4 caracteres.

arquivo.txt

>1A    THISISATEST
>1B    THATISATEST

resultado desejado:

>1A    THIS    ISATEST
>1B    THAT    ISATEST

Após pesquisar e tentar modificar, tentei usar este comando sed: sed 's/(.{4})(.{7}).*/ /' file.txt . No entanto, parece que não consigo fazer funcionar. Estou esquecendo de algo? No entanto, se você tiver uma sugestão de awk , isso também será útil. Além disso, por favor, explique suas sugestões. Estou no processo de aprendizado de awk e sed .

    
por cosmictypist 30.12.2015 / 18:05

5 respostas

2

Aqui está uma solução com awk . Ele separa os primeiros quatro caracteres e o restante da segunda coluna em duas variáveis e os imprime.

]$ awk '{s=substr($2,1,4)}{g=substr($2,5,length($2))}{print $1,s,g}' file.txt
1A THIS ISATEST
1B THAT ISATEST
    
por 30.12.2015 / 18:35
2

com sed :

sed 's/^[^ ]\+ \+[^ ]\{4\}/&\t/'

Como funciona:

  • ^ : início da linha
  • [^ ]\+ : caractere de espaço não correspondido pelo menos uma vez
  • \+ : caractere de espaço correspondido pelo menos uma vez
  • [^ ]\{4\} : caractere de espaço não correspondido exatamente quatro vezes
  • & : tudo correspondido entre os anteriores //
  • \t : guia

Saída:

>1A    THIS ISATEST
>1B    THAT ISATEST

Correcção correta:

sed 's/^[^ ][^ ]*  *[^ ]\{4\}/&\t/'

O padrão + é a extensão GNU, portanto é necessário simulá-lo com caracteres repetidos e * para ser compatível com posix.

    
por 30.12.2015 / 18:16
1
sed 's/ [^ ]\{1,4\}/& /' <in >out
>1A    THIS ISATEST

Ele funcionará para inserir um < space > após a correspondência mais longa da primeira ocorrência de uma sequência de 1 a 4 caracteres não espaciais imediatamente após um caractere de espaço. Isso significa que se a linha começar com espaços, ela afetará a primeira sequência não-espacial (que é um comportamento indiscutivelmente correto) , ou então se a segunda coluna separada por espaço consistir de quatro ou menos caracteres ela acrescente um espaço adicional a essa coluna (que é um comportamento indiscutivelmente incorreto) .

Em nenhum caso ele substitui em um espaço por todo quarto caracter não-espacial na segunda coluna, embora ele transforme a entrada de exemplo na saída de exemplo.

    
por 30.12.2015 / 19:27
0

Com o GNU awk

awk -F'\t' -vOFS='\t' '
  {patsplit($2, a, /.{4}/); 
   $2=""; for (k in a) $2=$2($2?"\t":"")a[k];  
   print}' file

Use patsplit para dividir o segundo campo ( $2 ) em pedaços de 4 caracteres armazenados na matriz a . Junte os pedaços de volta com um separador separador e defina no campo 2 antes de imprimir o registro

1A    THIS  ISATEST
1B    THAT  ISATEST
    
por 30.12.2015 / 18:37
0

Com o GNU awk você pode usar FPAT

awk '{$1=$1}1' OFS='\t' FPAT='>..\s+\w{4}|\w*$'
  • expressão >..\s+\w{4} corresponde a >1A THIS e \w*$ correspondem ao restante da string.

  • $1=$1 força a cadeia de saída com o novo separador OFS

  • 1 é substituto para {print $0}
por 30.12.2015 / 20:32

Tags