Como reformatar o texto em um arquivo para outra direção?

4

Eu tenho uma tabela no formato atual:

Lead:Arrow1:Arrow2:Arrow3
Follow:Arrow4:Arrow5:Arrow6:Arrow7:Arrow8:Arrow9

Eu quero transformar isso em

Lead
Arrow1
Arrow2
Arrow3
Follow
Arrow4
Arrow5
Arrow6
Arrow7
Arrow8
Arrow9

Eu tentei awk :

$(awk -F":" '/Lead/ {print NF-1}' $f)
$(awk -F":" '/Follow/ {print NF-1}' $f)

mas não funcionou. Como posso fazer isso em awk ou qualquer outro método?

    
por kashef 09.10.2018 / 14:49

3 respostas

8

Você pode usar tr da seguinte forma:

<file tr ":" "\n"

Lead
Arrow1
Arrow2
Arrow3
Follow
Arrow4
Arrow5
Arrow6
Arrow7
Arrow8
Arrow9

ou awk da seguinte forma:

<file awk '{gsub(/:/,"\n")}1'
Lead
Arrow1
Arrow2
Arrow3
Follow
Arrow4
Arrow5
Arrow6
Arrow7
Arrow8
Arrow9
    
por 09.10.2018 / 14:52
0

Outra solução super simples seria converter : s em espaços com sed e imprimir as palavras com echo em for loop:

for i in $(sed 's/:/ /g')
do
  echo $i
done

Este script funciona de stdin para stdout.

    
por 09.10.2018 / 23:40
0

Usando awk como você sugeriu:

$ awk '{ gsub(":", "\n", $0); print }' <file
Lead
Arrow1
Arrow2
Arrow3
Follow
Arrow4
Arrow5
Arrow6
Arrow7
Arrow8
Arrow9

Isso simplesmente substitui cada : nos dados de entrada por uma nova linha.

Outra solução awk que usa a variável OFS (Output Field Separator):

awk -v OFS='\n' -F ':' '{ $1=$1; print }' <file

A atribuição $1=$1 parece falsa, mas força awk a reformatar o registro de entrada atual de acordo com OFS (e ORS , mas não alteramos isso do padrão, que é uma nova linha), o que, nesse caso, significa inserir novas linhas entre todos os campos : -delimited.

Com awk , podemos também apenas iterar os campos : -delimited e imprimi-los individualmente:

awk -F ':' '{ for (i = 1; i <= NF; ++i) print $i }' <file
    
por 27.10.2018 / 16:36