Adicionando um padrão a cada campo da seguinte linha

1

Eu tenho a seguinte entrada:

MX04A;
DMX04A; DMX04A; LMX04A; LMX04A;
-17.2; -15.3; -14.3; -13.6;
-16.8; -15.4; -16.0; -15.3;
LH36A;
DLH36A; DLH36A;
-11; -117.2;
-11; -17.5;

Eu quero obter este resultado

 MX04A:DMX04A; MX04A:DMX04A; MX04A:LMX04A; MX04A:LMX04A;
 -17.2; -15.3; -14.3; -13.6;
 -16.8; -15.4; -16.0; -15.3;

 LH36A:DLH36A; LH36A:DLH36A;
 -11; -117.2;
 -11; -17.5;
    
por Tony 31.07.2015 / 02:43

3 respostas

0

Aqui está um começo que, pelo menos, funciona com os dados do exemplo:

sed -r '/[A-Z];/{N;s/([^;]+);\n([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+)/: : : :/;3,$s/^/\n/};s/^/ /' input.txt

Isto está assumindo o seguinte:

  • A linha 1 de cada registro sempre terá algumas letras maiúsculas
  • A linha 2 de cada registro sempre segue diretamente a linha 1
  • A linha 2 de cada registro sempre tem exatamente 4 campos (isso pode ser generalizado, mas precisa ser exatamente 4 por enquanto)
  • As linhas restantes de cada registro são sempre puramente numéricas, ou seja, sem letras
  • Todos os campos são separados por space semicolon .
  • os registros na saída devem ser separados por uma linha em branco, mas sem linhas extras em branco no início ou no final da saída.
por 31.07.2015 / 03:13
0

Os seguintes trabalhos:

sed -e'/-/!N;/;\n/!b' <i >o \
    -e's//:/;y/ /\n/;:n'    \
    -e's/^\(\([^:]*\).*\)\n/ :/;tn'

Ou com a sintaxe de expressão regular -E xtended (que funcionará pelo menos com AST / BSD / GNU sed s) :

sed -Ee'/-/!N;/;\n/!b' <i >o \
     -e's//:/;y/ /\n/;:n'    \
     -e's/^(([^:]*).*)\n/ :/;tn'

... que não é muito diferente e tem três caracteres a menos.

Ou em uma linha (por algum motivo) ...

sed -Ee'/-/!N;/;\n/!b' -e's//:/;y/ /\n/;:n' -e's/^(([^:]*).*)\n/ :/;tn' <i >o

OUTPUT

MX04A:DMX04A; MX04A:DMX04A; MX04A:LMX04A; MX04A:LMX04A;
-17.2; -15.3; -14.3; -13.6;
-16.8; -15.4; -16.0; -15.3;
LH36A:DLH36A; LH36A:DLH36A;
-11; -117.2;
-11; -17.5;
    
por 31.07.2015 / 05:47
0

Resposta para a primeira versão desta questão (antes dos dados serem alterados)

$ awk '/^[^;]*[[:alpha:]];/{a=$1; if (NR!=1)print"";getline; gsub(/(^| )/, " "substr(a,1,length(a)-1)":");print;next} {print " "$0;}' file
 MX04A:DMX04A; MX04A:DMX04A; MX04A:LMX04A; MX04A:LMX04A;
 -17.2; -15.3; -14.3; -13.6;
 -16.8; -15.4; -16.0; -15.3;

 LH36A:DLH36A; LH36A:DLH36A; LH36A:LLH36A; LH36A:LLH36A;
 -11; -117.2; 115.5; 16.8;
 -11; -17.5; 113.2; 15.6;

Ou:

$ awk -F';' '$1 ~ /[[:alpha:]]/ {a=$1; if (NR!=1)print""; getline; gsub(/(^| )/, " " a ":"); print; next} {print " "$0;}' file
 MX04A:DMX04A; MX04A:DMX04A; MX04A:LMX04A; MX04A:LMX04A;
 -17.2; -15.3; -14.3; -13.6;
 -16.8; -15.4; -16.0; -15.3;

 LH36A:DLH36A; LH36A:DLH36A; LH36A:LLH36A; LH36A:LLH36A;
 -11; -117.2; 115.5; 16.8;
 -11; -17.5; 113.2; 15.6;
    
por 31.07.2015 / 03:24