打印列数,如果有空字段则打印“错误”,如果没有空字段则打印“正确”

打印列数,如果有空字段则打印“错误”,如果没有空字段则打印“正确”

我有一个 csv,如下所示:

column1, column2, column3, column4, column5,
1,,,,5,
1,2,3,,,
1,2,3,4,5
1,2,3,4,5,
1,2,,,5,

使用 awk 我想打印所有行的数量,如果该列没有空字段,则打印注释“正确”;如果该列包含一个或多个空字段,则打印注释“错误”。

我有这个:

cat test_results.csv | awk -F"," '{for(i=1;i<=NF;i++) if($i=="") print NR, "ERROR"; else print NR, "CORRECTO"}'
1 CORRECTO
1 CORRECTO
1 CORRECTO
1 CORRECTO
1 CORRECTO
1 ERROR
2 CORRECTO
2 ERROR
2 ERROR
2 ERROR
2 CORRECTO
and so on 

不幸的是,此命令搜索行中的每个空空间,并返回它遇到的每个空且正确的字段的行号。

如果一列中没有空字段,如何更改它以获取每列的单个数字,并带有注释“正确”;如果其中有一个或多个空字段,则如何获取错误?

期望的输出:

1 ERROR
2 ERROR
3 ERROR
4 CORRECT
5 ERROR
6 ERROR

答案1

$ awk -F, '{ count=0; for(i=1; i<=NF; i++) count+=$i=="" 
           print NR, count? "ERROR" :"CORRECT";
}' infile
1 ERROR
2 ERROR
3 ERROR
4 CORRECT
5 ERROR
6 ERROR

如果您想打印空列的计数而不是行号:

$ awk -F, '{ count=0; for(i=1; i<=NF; i++) count+=$i==""
             print count? count " ERROR":"All CORRECT"
  }' infile
1 ERROR
4 ERROR
3 ERROR
All CORRECT
1 ERROR
3 ERROR

答案2

$ awk '{print NR, (/^,|,,|,$/ ? "ERROR" : "CORRECT")}' file
1 ERROR
2 ERROR
3 ERROR
4 CORRECT
5 ERROR
6 ERROR

答案3

我将用于awk此目的。

awk -F',' '{for(i=1;i<=NF;i++) { if($i=="") error[NR]++} print (error[NR])? NR " ERROR":NR " CORRECT"}' file.csv

for(i=1;i<=NF;i++) { if($i=="") error[NR]++}。该表达式查找空列( $1==""),每当找到空列时,error[NR]值就会增加 1。如果没有找到空列,则为error[NR]false。例如没有error[4]价值。让我们来看看:

awk -F',' '{for(i=1;i<=NF;i++) { if($i=="")  error[NR]++ } print "error[" NR"] =", error[NR]}' file.csv
error[1] = 1
error[2] = 4
error[3] = 3
error[4] = 
error[5] = 1
error[6] = 3

因为error[4]是 false,因此NR " CORRECT"}'打印 : 之后的语句。如果error[NR]为真,则在 ? 之后声明被打印。

相关内容