如何使用awk编辑csv文件的多个列

时间:2016-06-30 13:27:19

标签: shell csv awk

我想使用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

那么我如何以某种方式调整这个概念,我可以

  • 编辑多个列和
  • 显示整个csv文件

没有用特定选项写下每一列?

1 个答案:

答案 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 ,