使用 awk 计算两列的差异

gal*_*ica 2 bash awk

我想计算 csv 文件中的一些列差异,例如

文件:

item1,0.01,0.1
item2,0.02,0.2
item3,0.03,0.3
Run Code Online (Sandbox Code Playgroud)

预期输出文件:

item1,0.01,0.1,-0.09
item2,0.02,0.2,-0.18
item3,0.03,0.3,-0.27
Run Code Online (Sandbox Code Playgroud)

我尝试过这样的事情:

awk -F, '{print $2-$3 "," $0}'
Run Code Online (Sandbox Code Playgroud)

并在第一列中得到差异,但无法将其放在第四列中!以下内容不起作用,并给了我奇怪的结果,例如:',$0[original line]'。

awk -F, '{print $0 "," $2-$3}'
Run Code Online (Sandbox Code Playgroud)

这里发生了什么事?以及如何解决这个问题?我在 bash 下使用 GNU awk。

还尝试了以下提示:使用 awk 或 bash 减去两列的值 ,例如,

awk '{ $4 = $2 - $3 } 1'
Run Code Online (Sandbox Code Playgroud)

但也没有得到预期的结果。命令末尾的“1”有什么作用?

更新:我认为我的真实数据文件有问题:

fa8befbbf03c5539363996a576d5df20,0.725571036339,0.654274122734
fb51f93cc69b6be7375f518092330197,0.941242694855,0.888087145568
fc35b866ed1b3176193ccab251394cf2,0.0169462561607,0.10700264598
fd43d08452687499c00dc62511e5fb8c,0.13467258215,0.197959610293
fe4e8d77fa1770a331b3fca0f712d1a2,0.732236325741,0.302812807639
ff339fd5b4bfc7e916591ecc88286584,0.0581884384155,0.276936129794
ff34734e135192a75838d18e870bec86,0.941790342331,0.680042603973
ff34be2a8759cadcae3ea0fc74d7ef7e,0.111128211021,0.0429052298147
ff910f590b8d19dbc135d69a4bb6dc3e,0.400317430496,0.623828952199
ff9be3a6286f90d0b3ce7b049ac1cb9a,0.0130054950714,0.0511833470525
Run Code Online (Sandbox Code Playgroud)

这似乎打破了下面提出的两个解决方案。

$ awk -F, -v OFS="," '{$4=$2-$3}1' file2.csv 
,0.07129693c5539363996a576d5df20,0.725571036339,0.654274122734
,0.05315559b6be7375f518092330197,0.941242694855,0.888087145568
,-0.0900564b3176193ccab251394cf2,0.0169462561607,0.10700264598
,-0.063287687499c00dc62511e5fb8c,0.13467258215,0.197959610293
,0.429424a1770a331b3fca0f712d1a2,0.732236325741,0.302812807639
,-0.218748bfc7e916591ecc88286584,0.0581884384155,0.276936129794
,0.26174835192a75838d18e870bec86,0.941790342331,0.680042603973
,0.068223759cadcae3ea0fc74d7ef7e,0.111128211021,0.0429052298147
,-0.2235128d19dbc135d69a4bb6dc3e,0.400317430496,0.623828952199
,-0.0381779f90d0b3ce7b049ac1cb9a,0.0130054950714,0.0511833470525
Run Code Online (Sandbox Code Playgroud)

它们在示例数据文件上都运行良好。

谢谢!

Geo*_*iou 6

$ awk -F, -v OFS="," '{$4=$2-$3}1' file1
# Or awk -F, -v OFS="," '{$(NF+1)=$2-$3}1' file1
item1,0.01,0.1,-0.09
item2,0.02,0.2,-0.18
item3,0.03,0.3,-0.27
Run Code Online (Sandbox Code Playgroud)

$NF是最后一个字段。
$(NF+1)是最后一个字段之后的一个额外字段
OFS是输出字段分隔符
F(或FS)是输入字段分隔符

作用1: awk 语法始终遵循 “您可以省略”或“可以省略但不能同时
省略”的规则。condition{actions}conditionsactions

如果省略conditions,则1假定条件 = True = 始终执行以下操作{actions}

如果省略{actions},则执行默认操作 -->{print $0}

因此,单个1是一个简单的真实条件 = 执行默认操作 = {print $0}-$0到目前为止已修改