如何删除特定列中的字符并将其除以bash中的数字

时间:2016-04-29 14:57:34

标签: bash awk sed

我有这种格式的文件:

2015;1;1;11;7;19805;"2";12892;12478;"0900";"0853";-7.00;17.00;"0910";"1712";11.00;"1723";-6.00;329.00;330.00;302.00;2475.00;

我希望删除第10,11,14,15和17列中的引号 然后将这列中的数字除以2400.因此,我不是900,而是期望0.375(= 900/2400)。

最终输出应采用以下格式:

2015;1;1;11;7;19805;"2";12892;12478;0.375;0.355;-7.00;17.00;0.379;0.713;11.00;0.718;-6.00;329.00;330.00;302.00;2475.00;

我想我知道如何删除引号,但我绝对会丢失其余的......或者在python等中更容易?你能帮帮我吗?

2 个答案:

答案 0 :(得分:3)

以下是适合您情况的gnu awk脚本:

<强> rq.awk

BEGIN { FS=OFS=";"
        OFMT="%.6g" # change output decimal format
        # setup the field that should change:
        split("10 11 14 15 17", ndx, " ")
      }

      { for( k in ndx) {
          i=ndx[k]
          gsub(/"/, "", $i)
          $i=$i / 2400
        }
        # print all fields
        print
      }

运行它:awk -f rq.awk your_file

  • 在开头将字段转移到数组ndx
  • 每行
  • :它遍历ndx并且对于ndx中的每个字段:
    • gsub函数
    • 替换引号
    • 做分工
  • 单个print输出所有字段,包括修改后的字段

答案 1 :(得分:1)

使用awk来解决此问题的另一种方法:

awk -F";" 'BEGIN{OFS=";"}function GSUB(F){gsub(/"/,"",$F);$F=$F/2400} {GSUB(10);GSUB(11);GSUB(14);GSUB(15);GSUB(1);print $0}' infile

它定义了一个函数,用于将双引号替换为null,然后除以2400.然后我们只为每个字段调用它并打印记录。 BEGIN语句将输出字段分隔符OFS设置为分号;