Mesclar duas linhas de um arquivo e adicionar número no final das linhas

0

Eu tenho um arquivo de texto grande abc.txt com o seguinte formato:

BALT
-6.110
130.600
4.06874414
-0.03254425
BALT
-6.620
154.460
3.92286595
-0.17842244
BARM
32.740
140.680
3.94326190
-0.15802649

Eu preciso deste arquivo para converter um arquivo de saída xyz.txt no formato como:

BALT 1
 -6.110 130.600
 4.06874414
 -0.03254425
BALT 2
 -6.620 154.460
 3.92286595
 -0.17842244
BARM 3
 32.740 140.680
 3.94326190
 -0.15802649

Os números 1, 2, 3 ... depois do nome dos dados de quatro caracteres aumentarão à medida que eu for procurando mais dados.

    
por Abhay 23.10.2015 / 19:32

2 respostas

2

Aqui está um oneliner:

# sed 's/^[A-Z]/>&/' abc.txt | awk -v RS='>' 'NR>1 {printf("%s %d\n %s %s\n %s\n %s\n",$1,NR-1,$2,$3,$4,$5)}' > xyz.txt

Aqui está a saída gerada:

# cat xyz.txt 
BALT 1
 -6.110 130.600
 4.06874414
 -0.03254425
BALT 2
 -6.620 154.460
 3.92286595
 -0.17842244
BARM 3
 32.740 140.680
 3.94326190
 -0.15802649

Os detalhes:

Primeira parte - a parte sed da linha adiciona um caractere especial arbitrário ao início de cada registro (um registro é um nome seguido por 4 números). Eu escolhi um '>' para iniciar o registro. Isso facilita o processamento pelo awk.

Segunda parte - Para cada registro, basta imprimir um novo formato dos campos conforme você especificou. A única peculiaridade é que há um registro extra em branco no início - pulamos sobre isso (NR > 1).

    
por 23.10.2015 / 20:23
1

Existem 2 tarefas: numerar linha (s) apropriada (s) que a saída de formato:

nl -bp[A-Z] -nln abc.txt | 
sed '
     /^\w/{
           s/\(.*\)\(....\)/ /
           n
           N
           s/\n\s*/ /
          }
     s/^\s*/ /
    ' > xyz.txt

Ou se você gostar de awk

awk '
     /[A-Z]/ {
             print $0, ++count
             getline
             printf " %s", $0
             next
     }
     {
             print "", $0
     }
    ' abc.txt > xyz.txt
    
por 23.10.2015 / 21:16