我想使用awk编辑具有不同类型值的.csv文件,例如将几个不同列的所有值四舍五入到第二个小数位。其他行也可能包含浮点值,但这些行应以不同的方式处理。
假设一行看起来像下面那一行,我想编辑第7,第8和第9列(实际上它们更长,但所有相关类型的值都在这个例子中,所以它是' s只是规模问题):
L ,P_005 ,250.092 ,20.0 ,-0.80 ,0.803443 ,0.23342 ,0.83728329 ,0.0 ,0.0
输出应为
L ,P_005 , 250.092, 20.0, -0.80, 0.80, 0.23, 0.84, 0.0, E2=0.0
到目前为止,我总是围绕一列的价值" x"使用:
#/bin/sh
OLDIFS=$IFS
IFS = ","
file=$1
...
awk '{printf "%.2f",$x}' $1
...
IFS=$OLDIFS
那么我如何以某种方式调整这个概念,我可以
没有用特定选项写下每一列?
答案 0 :(得分:1)
如果我得到了正确的答案:
awk -F\; -v OFS=\; '
function foo(str) {
if(match(str, /[0-9]+\.[0-9]+/, arr)) {
gsub(/[0-9]+\.[0-9]+/, sprintf("%.2f",arr[0]), str)
}
return str
}
{
for(i=1; i<=NF; i++)
printf "%s%s", foo($i),(i<NF?OFS:ORS)
}' test.in
它产生了:
L;P_005;X 250; Y 20; Z 0; A 0.80; B 0.23; C 0.84; E1=0.00; E2=0.00 ,