아래와 같이 비어 있지 않은 두 개의 필드만 포함해야 하는 간단한 csv 파일이 있습니다.
다음은 올바른 csv 파일의 예입니다.
$ more file.csv
why_we_need_help,log_low=53687091200
whats_is_going_on,log_high=1073741824
this_is_caryze,log_low=53687091200
let_me_know_what_to_do,log_high=1073741824
look_on_the_room,log_low=53687091200
.
.
.
목표는 csv 파일에 비어 있지 않은 필드가 두 개만 포함되어 있는지 확인하는 것입니다.
파일에 필드가 두 개만 있는지 확인하기 위해 다음 awk로 시작합니다.
awk 'BEGIN{FS=OFS=","} NF!=2{print "not enough fields" }' file.csv
그러나 아래 예에서는 "필드가 충분하지 않음"을 제공하지 않아 작동하지 않습니다.
why_we_need_help,log_low=53687091200
whats_is_going_on,log_high=1073741824
this_is_caryze,log_low=53687091200
let_me_know_what_to_do,log_high=1073741824
look_on_the_room,
기타 오류 csv 파일의 예:
why_we_need_help,,log_low=53687091200
whats_is_going_on,log_high=1073741824
this_is_caryze,log_low=53687091200,
let_me_know_what_to_do,log_high=1073741824
look_on_the_room,log_low=53687091200,
또는
why_we_need_help log_low=53687091200
whats_is_going_on,log_high=1073741824
this_is_caryze,log_low=53687091200
let_me_know_what_to_do,log_high=1073741824
look_on_the_room,,
답변1
또 다른 awk 옵션은
awk 'BEGIN{FS=OFS=","}NF!=2||$1==""||$2==""{print "Not enough fields";exit 5}' file.csv
두 필드 중 하나가 비어 있는지 명시적으로 확인합니다. 그렇다면 메시지를 인쇄하고 오류 코드 5와 함께 즉시 종료됩니다(숫자는 임의적입니다. 가장 좋아하는 것을 선택하십시오).
답변2
이 시도:
awk 'BEGIN{FS=OFS=","} f{skip} NF!=2||!length($1)||!length($2){f=1} END{if (f) {print "File contains malformed lines"; exit 1}}' file.csv
f
파일에 두 개의 ,
구분 필드가 포함되어 있지 않거나 두 개의 필수 필드가 비어 있을 때마다 플래그가 설정됩니다. 마지막으로 파일을 구문 분석하는 동안 플래그가 설정되면 메시지를 인쇄하고 요청에 따라 오류 코드 1로 종료됩니다.
플래그가 이미 설정된 경우 첫 번째 규칙은 프로세스 속도를 높이기 위해 라인 구문 분석을 건너뛰게 됩니다. 왜냐하면 잘못된 라인이 있는지 알고 싶기 때문입니다. 따라서 그러한 라인이 발견되면 파일이 잘못된 것임을 알 수 있습니다. 파일의 나머지 부분을 고려해야 합니다.
잘못된 형식의 줄 수를 알고 싶다면 다음과 같은 작은 변경 사항을 사용하여 인쇄할 수 있습니다.
awk 'BEGIN{FS=OFS=","} NF!=2||!length($1)||!length($2){f++} END{if (f) {printf("File contains %d malformed line(s)\n",f); exit 1}}' file.csv
답변3
잘 모르겠지만 당신이 찾고 있는 것은 다음과 같습니다.
awk -F',' 'NF!=2 || /^,|,$/{print "bad:", NR | "cat>&2"; exit 1}' file
해당 라인의 특정 오류를 보고하도록 개선될 수 있습니다.
awk -F',' '
NF<2 { err="too few fields" }
NF>2 { err="too many fields" }
/^,|,$/ { err=(err == "" ? "" : err " and ") "empty fields" }
err != "" { print err, "at line", NR | "cat>&2"; exit 1 }
' file
또는 모든 줄의 모든 오류를 한 번에 찾으려면 다음을 수행하세요.
awk -F',' '
NF<2 { err="too few fields" }
NF>2 { err="too many fields" }
/^,|,$/ { err=(err == "" ? "" : err " and ") "empty fields" }
err != "" { print err, "at line", NR | "cat>&2"; err=""; f=1 }
END { exit f }
' file
답변4
입력 파일
cat op.txt
why_we_need_help,log_low=53687091200
whats_is_going_on,log_high=1073741824
this_is_caryze,log_low=53687091200
let_me_know_what_to_do,log_high=1073741824
look_on_the_room,log_low=53687091200
look_on_the_room,
,ajay
awk 명령
awk -F "," 'NF == "2" {print $0}' filename | sed "s/,/ /g"| sed -n '/\s\{2,\}/!p'| awk '{gsub(" ",",",$0);print}'
산출
why_we_need_help,log_low=53687091200
whats_is_going_on,log_high=1073741824
this_is_caryze,log_low=53687091200
let_me_know_what_to_do,log_high=1073741824
look_on_the_room,log_low=53687091200
파이썬
#!/usr/bin/python
import re
u=re.compile(r' {2,}')
k=open('filename','r')
for i in k:
q=re.sub(","," ",i)
if not re.search (u,q):
print q.replace(" ",",").strip()
산출
why_we_need_help,log_low=53687091200
whats_is_going_on,log_high=1073741824
this_is_caryze,log_low=53687091200
let_me_know_what_to_do,log_high=1073741824
look_on_the_room,log_low=53687091200