如果 column/field 包含超过特定数量的非数字值,则将其删除
Delete the column/field if it contains more than specific number of non-numeric values
类似于我之前的问题 ,我有一个包含非数字字段的数据:
在此示例中,我想删除那些具有超过特定数量的非数字字符(Off
和 No 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 个或更多)非数字字符的列。在这里,Column 3 有两个 No Data
和一个 Off
,所以我想在这里删除 3rd Column。我在循环中尝试了这个但没有成功
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 Data
和 Off
,但会保持字段(列)不变。我想要的输出是:
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
您可以使用这个 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
类似于我之前的问题 Off
和 No 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 个或更多)非数字字符的列。在这里,Column 3 有两个 No Data
和一个 Off
,所以我想在这里删除 3rd Column。我在循环中尝试了这个但没有成功
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 Data
和 Off
,但会保持字段(列)不变。我想要的输出是:
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
您可以使用这个 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