我有一个 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]
为真,则在 ? 之后声明被打印。