Como localizar e substituir um valor de coluna de campo no UNIX

2

Eu tenho um arquivo com o valor digamos, que é delimitado por |

123-|aaa|bbb|123|123.0|123-|123.01-|-123.02|123.03-|aaa|bbb|123-|aaa-|-bbb|cc-cc|123.04-|aa123-|123.05-

Eu preciso escolher os valores da coluna que terminam com - , a coluna escolhida deve ser um valor numérico e, em seguida, mover o - para o início do valor.

    
por Meghana Prakash 25.03.2014 / 10:39

2 respostas

3

POSIXly:

sed ':1
     s/^\(.*|\)\{0,1\}\([0-9.]*[0-9][0-9.]*\)-\(|.*\)\{0,1\}$/-/
     t1'

Ou com awk de uma forma mais intuitiva:

awk -F '|' -v 'OFS=|' '{
  for (i = 1; i <= NF; i++)
    if ($i ~ /^[0-9]*(\.[0-9]+)?-$/)
      $i = "-" substr($i, 1, length($i)-1)
  print}'

(essa versão é mais estrita no que considera ser um número , o sed aceitaria 1...2 como um número por exemplo).

Na sua entrada, isso dá:

-123|aaa|bbb|123|123.0|-123|-123.01|-123.02|-123.03|aaa|bbb|-123|aaa-|-bbb|cc-cc|-123.04|aa123-|-123.05
    
por 25.03.2014 / 10:57
2

Você pode fazer isso ancorando a correspondência no início da linha ou em um separador. Por exemplo, com uma expressão regular estendida do GNU sed:

sed -r ':a; s/(^|\|)([0-9.]+)-(\||$)/-/; ta' infile

Saída:

-123|aaa|bbb|123|123.0|-123|-123.01|-123.02|-123.03|aaa|bbb|-123|aaa-|-bbb|cc-cc|-123.04|aa123-|-123.05
    
por 25.03.2014 / 10:46