열 수를 인쇄하고, 빈 필드가 있으면 "오류", 빈 필드가 없으면 "수정"을 인쇄합니다.

열 수를 인쇄하고, 빈 필드가 있으면 "오류", 빈 필드가 없으면 "수정"을 인쇄합니다.

다음과 같은 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씩 증가합니다. 빈 열이 없으면 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]? 뒤의 명령문이 인쇄됩니다.

관련 정보