如果列/字段包含超过特定数量的非数字值,请将其删除

时间:2016-09-19 08:26:42

标签: bash shell unix awk gawk

与我之前的问题Delete the row if it contains more than specific number of non numeric values类似,我的数据包含非数字字段: 我想在此示例中删除那些具有超过特定数量的非数字字符(OffNo Data)的列(字段)。我想从第3个字段开始计算,即忘记前两行。

Tag, Description,2015/01/01,2015/01/01 00:01:00,2015/01/01 00:02:00
1827XYZR/KB.SAT,Data from Process Value, 2.10000, No Data, 2.7
1871XYZR/KB.RAT,Data from process value, Off    , 2.87583, No Data
1962XYMK/KB.GAT,Data from Process Value, No Data, 5      , 3
1867XYST/KB.FAT,Data from process value, 1.05000, 5.87   , 7.80
1871XKZR/KB.VAT,Data from process value, No Data, Off    , 2

在上面的数据中(没有空格,我只保留它以显示格式),我想删除所有那些出现两次以上(3次或更多次)非数字字符的列。这里,第3列有两个No Data和一个Off,所以我想在这里删除第三列。我在循环中尝试了这个但没有成功

awk -F ',' '{
for(n=3; n<=NF; n++)
    {   
        a = $n
        if(n!=NF)
        {
            fmt="%s,";
        }               
        else
        {
            fmt="%s\n";
        }
        if(gsub(/No Data|Off/,"",a)<2)
        {   
            printf(fmt,$n);
        }       
    }
 }' testfile.txt

我也试过

awk -F, '{for(i=3;i<=NF;i++)if(gsub(/No Data|Off/,"",$i)<3)f=f?f FS $i:$i;print f;f=""}' testfile.txt

但这只会删除单词No DataOff,但会保持字段(列)不变。我想要的输出是:

Tag, Description,2015/01/01 00:01:00,2015/01/01 00:02:00
1827XYZR/KB.SAT,Data from Process Value, Off     ,2.7
1871XYZR/KB.RAT,Data from process value, 2.87583 ,No Data
1962XYMK/KB.GAT,Data from Process Value, 5       ,3
1867XYST/KB.FAT,Data from process value, 5.87    ,7.80
1871XKZR/KB.VAT,Data from process value, Off     ,2

1 个答案:

答案 0 :(得分:1)

您可以使用此awk命令:

awk -F, '{
   for (i=1; i<=NF; i++) {
      cell[NR,i]=$i
      if (i>2 && $i+0 != $i)
         nn[i]++
   }
   nf=NF
   nr=NR
} 
END {
   for (r=1; r<=nr; r++) {
      for (c=1; c<=nf; c++)
         if (nn[c]<4)
            printf "%s%s", (c>1?FS:""), cell[r,c]
      print ""
   }
}' file

Tag,Description,2015/01/01 00:01:00,2015/01/01 00:02:00
1827XYZR/KB.SAT,Data from Process Value,No Data,2.7
1871XYZR/KB.RAT,Data from process value,2.87583,No Data
1962XYMK/KB.GAT,Data from Process Value,5      ,3
1867XYST/KB.FAT,Data from process value,5.87   ,7.80
1871XKZR/KB.VAT,Data from process value,Off    ,2