Como mesclar as linhas no Unix (Sun Solaris) em um padrão específico

1

Eu tenho abaixo n número de linhas em um arquivo simples:

uk,1234560000
uk,6789067000
uk,4567890000
.
.
.
n lines

Agora eu tenho que fazer isso no formato abaixo:

uk,1234560000-1234560000,6789067000-6789067000,4567890000-4567890000,......

Como posso fazer essa transformação?

    
por Montu 15.04.2015 / 06:04

2 respostas

1

Existem várias maneiras de fazer isso. Aqui está um usando apenas o shell (sem programas externos):

#!/bin/sh
IFS=, read -r f1 f2
printf "%s,%s-%s" "$f1" "$f2" "$f2"
while IFS=, read -r f1 f2
do
    printf ",%s-%s" "$f2" "$f2"
done
printf "\n"

Coloque o texto acima em um arquivo chamado, digamos, myscript.sh , do chmod +x myscript.sh , e depois execute ./myscript.sh com entrada e saída redirecionada para onde você quiser.

O código é simples

  • Leia dois campos, separados por , . Escreva campo1 , campo2 - campo2, não terminado por uma nova linha.
  • Embora não esteja no final do arquivo, leia dois campos, separados por , . Escreva o segundo duas vezes, precedido por um , , separado por - , e não terminado por uma nova linha.
  • Depois de lermos o arquivo inteiro (chegou ao fim do arquivo), escreva uma nova linha.
por 15.04.2015 / 06:48
1

Começando com este arquivo:

$ cat file
uk,1234560000
uk,6789067000
uk,4567890000

Se a formatação da pergunta estiver correta, acredito que isso faz o que você pergunta:

$ awk -F, '1==NR{printf "%s",$1} {printf ",%s-%s",$2,$2} END{print""}' file
uk,1234560000-1234560000,6789067000-6789067000,4567890000-4567890000

Como funciona

o awk irá ler um registro (linha) de cada vez. Cada linha é dividida em campos. Com esse arquivo de amostra e uma vírgula como o separador de campo, o primeiro campo, chamado $1 , é sempre uk e o segundo campo, chamado $2 , é o número.

  • -F,

    Isso faz com que o awk trate uma vírgula como um separador de campo.

  • 1==NR{printf "%s",$1}

    NR é o número de linhas lidas até o momento. Quando 1 == NR , estamos na primeira linha. Quando estamos na primeira linha, isso diz ao awk para imprimir o primeiro campo, uk .

  • printf ",%s-%s",$2,$2

    Para todas as linhas, isso indica ao awk para imprimir uma vírgula seguida pelo segundo campo, um traço e o segundo campo novamente.

  • END{print""}

    Quando chegamos ao final do arquivo, isso diz ao awk para imprimir uma nova linha.

por 15.04.2015 / 06:23