Como posso dividir a saída com o delimitador?

3

Eu gostaria de mudar:

e·ver·y·bo·dy

para:

e·ver·y·bo·dy
e·ver·y·bo·
e·ver·y·
e·ver·
e·

Um loop for será muito preferido.

    
por TuxForLife 20.03.2015 / 07:31

4 respostas

2

Isso também usa um loop for , embora um loop awk for :

$ echo "e·ver·y·bo·dy" | awk -F· -v OFS=· '{print;for (i=NF;i>1;i--){$i="";print;NF--} }'
e·ver·y·bo·dy
e·ver·y·bo·
e·ver·y·
e·ver·
e·

Versão alternativa de curto para longo

$ echo 'e·ver·y·bo·dy' | awk -F· -v OFS=· '{for (i=1;i<=NF;i++){for (j=1;j<=i;j++)printf "%s%s",$j,j<NF?OFS:"";print""} }'
e·
e·ver·
e·ver·y·
e·ver·y·bo·
e·ver·y·bo·dy

Outra variação

$ echo 'e·ver·y·bo·dy' | awk -F· -v OFS=· '{s="";for (i=1;i<=NF;i++){s=s OFS $i; printf "%s",substr(s,2); print (i==NF)?"":OFS} }'
e·
e·ver·
e·ver·y·
e·ver·y·bo·
e·ver·y·bo·dy
    
por John1024 20.03.2015 / 08:11
2

Você pode fazer isso por um comando awk mais curto, como abaixo ( longo para pequeno ):

$ awk -F'·' '{while (NF){ print $0;NF--;ORS="·\n"}}' OFS='·' file
e·ver·y·bo·dy
e·ver·y·bo·
e·ver·y·
e·ver·
e·

E de pequeno para longo da seguinte forma:

$ awk -F'·' '{i=1; while(i<NF){ print tmp=tmp$((i++))"·"} print $0}' file
e·
e·ver·
e·ver·y·
e·ver·y·bo·
e·ver·y·bo·dy
    
por αғsнιη 20.03.2015 / 09:26
1

Se tiver que ser um loop for :

IFS=·
for l in $(echo "e·ver·y·bo·dy"); do x="$x$l·"; echo "$x"; done | tac

Primeiramente, precisamos definir o separador de arquivos internos como · . Em seguida, o loop for percorre cada paz e imprime, mas na ordem errada. É por isso que tac no final reverte a ordem.

Dá-me a saída:

e·ver·y·bo·dy·
e·ver·y·bo·
e·ver·y·
e·ver·
e·
    
por chaos 20.03.2015 / 07:57
1

Aqui está uma solução python :

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
input_str = 'e·ver·y·bo·dy'
input_list = input_str.split('·')
print input_str
i = len(input_list)
while i > 1:
    print '·'.join(input_list[:i-1]) + '·'
    i -= 1

Aqui nós primeiro split a string de entrada usando · como o delimitador para gerar uma lista e depois usamos list slicing e join para obter a saída desejada.

    
por heemayl 20.03.2015 / 20:10