列数を印刷し、空のフィールドがある場合は「エラー」、空のフィールドがない場合は「修正」を印刷します。

列数を印刷し、空のフィールドがある場合は「エラー」、空のフィールドがない場合は「修正」を印刷します。

次の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]?後のステートメントが印刷されます。

関連情報