Substitui a entrada da coluna pela soma das outras entradas da coluna

2

Digamos que eu tenha um arquivo que contenha estas linhas:

02.03.14    14.50   14.50   0.00    Desc
02.03.14    17.00   0.00    17.00   Desc
01.03.14    2.82    1.68    calc    Desc
02.03.14    1.04    0.00    1.04    Desc
06.03.14    6.00    0.00    6.00    Desc
08.03.14    11.76   2.98    calc    Desc
10.03.14    3.27    0.00    3.27    Desc

Desejo substituir todas as entradas de coluna que contêm calc (apenas aparecem na coluna 4th ) para conter a diferença entre a coluna 3nd e 2nd , portanto 4th=3rd-2nd .

Como posso fazer isso?

    
por polym 27.07.2014 / 23:08

2 respostas

6

Sed não pode fazer aritmética¹. Use awk em vez disso.

awk '
    $4 == "calc" {sub(/calc(  |\t)/, sprintf("%-6.2f", $3 - $2))}
    1'

O 1 no final significa imprimir tudo (após qualquer transformação anterior). Em vez da substituição de texto com sub , você poderia atribuir a $4 , mas isso substitui o espaço entre colunas (que pode ser qualquer sequência de espaços e guias) por um único caractere de espaço. Se suas colunas forem separadas por tabulações, você poderá usar

awk '
    BEGIN {ORS = "\t"}
    $4 == "calc" {$4 = sprintf("%.2f", $3 - $2))}
    1'

¹ Sim, sim, tecnicamente pode, já que é Turing-complete. Mas não de qualquer maneira sensata.

    
por 27.07.2014 / 23:13
1
awk -F "\t" '$4 == "calc" {$4 = $3-$2}1' OFS='\t' file
    
por 28.07.2014 / 05:39