2015-09-15 109 views
1

我在一個文件夾中有一堆CSV文件。他們都在同一個結構上。超過2k列。第一列是ID。改進csv文件的bash腳本

我需要做的每個文件執行以下操作: 對於每個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 

任何人都可以查看是什麼問題?

回答

3

您需要從邏輯跳過第一列在以前的專欄檢查0:

awk 'BEGIN{FS=OFS=","; out=ARGV[1] ".removed.index"} 
FNR==NR { 
    for (i=1; i<=NF; i++) 
     sums[i] += $i; 
    ++r; 
    next 
} FNR==1 { 
    for (i=3; i<=NF; i++) { 
     if (sums[i] == 0) { 
     if (i-1 in sums) { 
      delete sums[i-1]; 
      print "removed index: " (i-1) > out 
     } 
     delete sums[i]; 
     print "removed index: " i > out 
     } else if (sums[i] == 100*r) { 
     delete sums[i]; 
     print "removed index: " i > out 
     } 
    } 
} { 
    printf "%s", $1 
    for (i=2; i<=NF; i++) 
     if (i in sums) 
     printf "%s%s", OFS, $i; 
    printf "%s", ORS 
} END{close(out)}' file file 

輸出:

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 
+0

回覆晚了非常抱歉。是的,輸出csv文件現在是正確的。但是,索引打印存在問題。根據上例的索引文件,刪除的索引是:8,9,11,但假設爲2,3,4,5,7,8,9,11。 – Omri

+0

現在很好。非常感謝您的幫助。最後一件小事 - 我不希望removed.index的文件名將根據原始文件名命名:'originalFileName.removed.index'。目前該文件一次又一次被覆蓋。我試過使用'$ {f} _removed.index',但它不起作用。 – Omri

+0

確定可以完成。檢查更新的答案。 – anubhava