次の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を使用してすべての行の数を印刷し、列に空のフィールドがない場合は「正しい」コメントを印刷し、列に1つ以上の空のフィールドがある場合は「エラー」コメントを印刷したいと思います。
私はこれを持っています:
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ずつ増加します。空の列がない場合はFalseですerror[NR]
。たとえば、値がありません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"}'
文が印刷されます。 trueの場合error[NR]
?後のステートメントが印刷されます。