【发布时间】:2017-12-08 18:22:12
【问题描述】:
我有一个大的 (2GB) 逗号分隔文本文件,其中包含来自传感器的一些数据。有时传感器关闭并且没有数据。如果每行中有超过指定数量的 No Data 或 Off 或 any non-numeric 值,我想删除这些行;不包括标题。我只对从第 3 列开始计数感兴趣。例如:我的数据如下:
Tag, Description,2015/01/01,2015/01/01 00:01:00,2015/01/01 00:02:00, 2015/01/01 00:02:00
1827XYZR/KB.SAT,Data from Process Value,2.1,Off,2.7
1871XYZR/KB.RAT,Data from process value,Off,No Data, No Data
1962XYMK/KB.GAT,Data from Process Value,No Data,5,3
1867XYST/KB.FAT,Data from process value,1.05,5.87,7.80
1871XKZR/KB.VAT,Data from process value,No Data,Off,2
这里的第一行是标题,我想保持原样。但我想从第 3 列开始删除任何列/字段中具有 2 个或多个 No Data 或 Off 或任何 non numeric 字段的那些行。换句话说,具有 4 个或 5 个文本字段的行。在示例中,第 3 行和第 6 行以上有 2 个或多于 2 个 No Data 或 Off 字段,我想删除它们。因此,我的首选输出是
Tag, Description,2015/01/01,2015/01/01 00:01:00,2015/01/01 00:02:00, 2015/01/01 00:02:00
1827XYZR/KB.SAT,Data from Process Value,2.1,Off,2.7
1962XYMK/KB.GAT,Data from Process Value,No Data,5,3
1867XYST/KB.FAT,Data from process value,1.05,5.87,7.80
我可以针对特定情况使用循环执行此操作:
awk -F, '{ non_numeric=0;
for(i=1;i<=NF;i++){
if($i ~ // ) non_numeric++
}
if(non_numeric<2) print $0
}' testfile.txt
在这里,我只考虑No Data 和Off。如何计算所有非数字字符串。如果我将 if 语句更改为
if($i ~ /[^0-9]/ ) non_numeric++
它不起作用并且没有输出。另外,由于我使用的是循环,我认为它会很慢。我们能以某种方式加快速度吗?任何命令行解决方案都可以。
【问题讨论】:
-
使用
for()循环计算数字字段的数量。循环完成后,如果它至少为 4,则打印该行。 -
基本上,我只是重申了您的要求。将其转换为
awk代码应该很简单。请展示您尝试过的内容,以便我们帮助您修复它。我们不会为你做你的工作。 -
示例数据中的第三行包含以下内容:
No Data. No Data。这是一个错字吗?.应该是,吗? -
@Barmar 和 redneb 我添加了自己的工作并修复了数据中的错字。很抱歉没有保持离散。
-
应该是两个或两个以上。我也更正了这个问题,很抱歉造成混乱。
标签: bash awk sed preprocessor gawk