改进csv文件的bash脚本

时间:2015-09-15 20:59:40

标签: bash awk

我在一个文件夹中有一堆CSV文件。所有这些都在同一个结构上。超过2k列。第一列是ID。

我需要为每个文件执行以下操作: 对于每个n 奇数列(第一列除外),请执行以下操作:

  • 如果n值为0,则对于所有行,然后删除n列以及n-1
  • 如果n值为100,则对于所有行,然后删除n列
  • 打印已删除列的索引

我有以下代码:

for f in *.csv; do
        awk 'BEGIN { FS=OFS="," }
        NR==1 {
      for (i=3; i<=NF; i+=2)
         a[i]
     }FNR==NR {
           for (i=1; i<=NF; i++)
              sums[i] += $i;
           ++r;
           next
        } {
           for (i=1; i<=NF; i++)
              if (sums[i] > 0 && sums[i+1]>0 && sums[i] != 100*r)
                 printf "%s%s", (i>1)?OFS:"", $i;
              else print "removed index: " i > "removed.index"
              print ""
   }' "$f"  "$f" > "new_$f"
done 

由于某种原因,ID列(第一列)已被删除。

输入:

23232,0,0,5,0,1,100,3,0,33,100
21232,0,0,5,0,1,100,3,0,33,100
23132,0,0,5,0,1,100,3,0,33,100
23212,0,0,5,0,1,100,3,0,33,100
24232,0,0,5,0,1,100,3,0,33,100
27232,0,0,5,0,1,100,3,0,33,100

当前输出(差):

,1,33
,1,33
,1,33
,1,33
,1,33
,1,33

预期产出:

23232,1,33
21232,1,33
23132,1,33
23212,1,33
24232,1,33
27232,1,33

任何人都可以查看问题是什么吗?

1 个答案:

答案 0 :(得分:3)

您需要跳过逻辑中的第一列以检查上一列中的0:

23232,1,33
21232,1,33
23132,1,33
23212,1,33
24232,1,33
27232,1,33

<强>输出:

cat file.removed.index

cat removed.index
removed index: 2
removed index: 3
removed index: 4
removed index: 5
removed index: 7
removed index: 8
removed index: 9
removed index: 11

同样删除的索引是:

$SPARK_HOME_DIR/bin/spark-submit --master $MASTER_REST_URL --kill $DRIVER_ID