Substituindo cada 10º pipe por nova linha no unix

1

Digamos que eu tenha campos:

name, number, id

Eu tenho um arquivo de dados:

name1|number1|id1|name2|number2|id2...etc

Eu quero substituir cada terceiro pipe por uma nova linha ou '\ n', então fico:

name1|number1|id1  
name2|number2|id2  

Não estou tendo sorte com o awk ou sed.

Eu tentei o seguinte e variações de:

awk '/"\|"/{c++;if(c==10){sub("\|","\n");c=0}}1' inputfile.txt  
sed 's/"|"/"\n"/2' inputfile.txt  

Isso me diz awk:

syntax error near line 1

awk: illegal statement near line 1

awk: syntax error near line 1

awk: bailing out near line 1

Qualquer ajuda é muito apreciada!

EDIT: Obrigado!

    
por user327958 30.05.2014 / 15:52

2 respostas

3

Você pode, por exemplo, usar isto:

$ awk -v RS="|" '{printf $0 (NR%3?RS:"\n")}' file
name1|number1|id1
name2|number2|id2..

Explicação

  • -v RS="|" define o separador de registro como | .
  • printf $0 (NR%3?RS:"\n") imprime a linha completa com uma nova linha, caso o número de registros seja múltiplo de 3.
por 30.05.2014 / 16:09
1

Uma resposta bash pura. Não é tão elegante quanto a solução awk , mas pode ser útil:

i=3; IFS='|'; while read -a line; do echo "${line[*]:0:$i}"; echo "${line[*]:$i}"; done < inputfile.txt

Explicação:

  • i=3 Defina isso para o número de campos que você deseja por linha.
  • IFS='|' Define o delimitador como pipe.
  • while read -a line Leia cada linha do arquivo de entrada em uma matriz bash.
  • echo "${line[*]:0:$i}" Imprime os primeiros valores $i da matriz em uma linha.
  • echo "${line[*]:$i}" Imprime o restante da matriz em uma linha.
por 31.05.2014 / 04:54