Bash - arquivo, matrizes e saída

4

Eu tenho um arquivo que contém os nomes dos funcionários, os departamentos e as cidades em que o funcionário está, algo como:

John
IT
Chicago
Joshua
accounting
New York
Marcy
CEO
Los Angeles
... 

Eu tenho que transformar esse arquivo para este formato:

John?IT?Chicago
Joshua?accounting?New York
Marcy?CEO?Los Angeles

usando o ponto de interrogação como um delimitador de campo

Eu fiz este script bash até agora:

fname="mix.txt"
exec<$fname

index=0
while read line ; do
        ARRAYLINES[$index]="$line"
        index=$(($index+1))
done < $fname

NUMBERLINES=$(grep -c "" $fname)
NUMBERLOOP=$(($NUMBERLINES/3))


count=0

for i in $(eval echo {1..$NUMBERLOOP})
do
  one=$(($count+1))
  two=$(($count+2))

  LINE0=${ARRAYLINES[$count]}
  LINE1=${ARRAYLINES[$one]}
  LINE2=${ARRAYLINES[$two]}
  ((count + 3))

  FINAL="$LINE0?$LINE1?$LINE2"
  echo $FINAL >> final.txt
done

O arquivo final tem o número correto de linhas, mas todas as linhas são iguais aos dados do primeiro funcionário, como

John?IT?Chicago
John?IT?Chicago
John?IT?Chicago
John?IT?Chicago
John?IT?Chicago
John?IT?Chicago
John?IT?Chicago

alguma pista?

    
por SpaceDog 29.11.2011 / 19:12

3 respostas

2

com

(( count + 3 ))

você acabou de adicionar 3 a $ count e descarta o resultado. Experimente com

(( count = count + 3 ))
    
por 29.11.2011 / 19:17
7

Normalmente eu não sou fã de postar respostas "na verdade você deveria fazer assim", mas alguém já abordou o erro no seu script e eu não consigo me impedir - você está fazendo isso muito difícil. Isso é muito mais fácil com uma ferramenta como sed ou awk . Por exemplo, em sed :

$ sed 'N; N; s/\n/?/g' /path/to/your/file

Isso lê três linhas (uma por padrão, as outras duas por causa de N; N; ) e substitui as novas linhas por pontos de interrogação ( s/\n/?/g ). Ele irá gerar a versão convertida do arquivo; Se você quiser substituir o conteúdo no local, use o -i flag

    
por 29.11.2011 / 19:31
2

Outra maneira de fazer isso é com paste :

<infile paste -d '?' - - -

Isto irá colar três linhas de uma vez usando o ponto de interrogação como delimitador. Se velocidade / processamento rápido é o que você precisa, então este é o caminho a percorrer. Além disso, como Stéphane Chazelas 'aponta , você pode até mesmo editar o arquivo no local.

    
por 26.12.2015 / 22:15