다음과 같은 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]
? 뒤의 명령문이 인쇄됩니다.