用其他列条目的总和替换列条目

pol*_*lym 2 sed awk text-processing

假设我有一个包含以下行的文件:

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
Run Code Online (Sandbox Code Playgroud)

我想替换所有包含calc(仅出现在4th列中)的列条目以包含3nd2nd列之间的差异,因此4th=3rd-2nd.

我怎么能这样做?

Gil*_*il' 6

Sed 不会算术¹。请改用 awk。

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

所述1在端装置进行打印的一切(任一前述变换之后的)。sub您可以将文本替换为,而不是$4,但这样做会用单个空格字符替换列间空格(可以是任何空格和制表符序列)。如果您的列以制表符分隔,则可以使用

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

¹是的,是的,技术上可以,因为它是图灵完备的。但不是以任何理智的方式。