학생의 연락처 정보가 포함된 데이터세트가 있는데, 샘플 데이터세트는 다음과 같습니다.
First Name, Last Name, Address, Phone Number
John, Doe, "House # 11, Street xyz, Road, Area",00000000
Sara, Taylor, "Jake Lake%, Apartment #22, Main Road, Area XYZ", 00000000
교체하기 위해 다음 명령을 실행하고 있습니다.,주소 표시줄에|데이터베이스에 로드합니다.
awk '!(NR%2){gsub(",","|")} {printf RFS $0} {RFS="\""}' RS=\" fileName.txt > output.txt
내가 직면한 문제는 이 명령을 실행할 때마다 다음 오류가 반환된다는 것입니다. 처음에는 정상적으로 작동했습니다.
awk: run time error: not enough arguments passed to printf(""Jake Lake%, Apartment #22, Main Road, Area XYZ")
해결책이 있나요? 나는 알아차렸다%주소에 나타나는 문제인가요?
답변1
- 견고성을 위해 절대 이 작업을 수행하지 말고
printf $0
항상printf "%s", $0
그 반대를 사용하십시오. 입력에 형식 문자가 포함된 경우 전자는 실패하므로printf
(현재 보고 있는 대로)printf
모든 입력 데이터를 사용하는 경우에도 동일하게 적용됩니다 . RFS
명확성과 견고성을 위해, 예를 들어 내장 변수 이름과의 충돌을 피하고 내장 변수를 사용하지 않을 때 내장 변수를 사용하는 것처럼 보이게 하여 코드 혼동을 피하기 위해 변수 이름 전체를 대문자로 사용하지 마십시오 .- 가독성을 위해 예를 들어 스크립트 뒤에 변수를 설정하지 마십시오
RS
. 다른 입력 파일에 대해 다른 값으로 설정해야 하는 경우가 아니면 스크립트 앞이나 시작 부분에 변수를 설정하여 스크립트가 실행될 때 볼 수 있도록 하세요. 스크립트가 읽혀졌습니다. 스크립트가 사용되는 것을 보기 전에 설정됩니다. - 효율성, 단순성 및 견고성을 위해 *sub()의 첫 번째 매개변수는 문자열이 아닌 정규식이므로 지정하지 않는 한
/.../
문자열( ) 구분 기호 대신 정규식("..."
)을 사용하십시오. 어떤 이유로 정적 정규식이 아닌 동적 필요합니다. - 명확성과 유지 관리 용이성을 위해 및 와 같이 동일한 값을 가져야 하는 두 개의 변수가 있는 경우
RS
와RFS
같이 개별적으로 동일한 값으로 설정하거나 또는 다음 중 하나와RS="\""; RFS="\""
같이 해당 값으로 함께 설정 하지 마십시오.RS=RFS="\""
하나, 예를 들어RS="\""; RFS=RS
.
질문에 코드를 올바르게 작성하는 방법은 다음과 같습니다.
$ awk -v RS='"' '!(NR%2){gsub(/,/,"|")} {printf "%s%s", rfs, $0; rfs=RS}' file
First Name, Last Name, Address, Phone Number
John, Doe, "House # 11| Street xyz| Road| Area",00000000
Sara, Taylor, "Jake Lake%| Apartment #22| Main Road| Area XYZ", 00000000
awk를 사용하여 CSV로 더 많은 작업을 수행하려면 다음을 참조하세요.awk를 사용하여 csv를 효율적으로 구문 분석하는 가장 강력한 방법은 무엇입니까.
답변2
RFS
발생하는 오류는 (빈 변수) 값을 사용하고 $0
형식 문자열로 AND 연결을 사용하기 때문에 발생합니다 printf
.
파일은 유효한 CSV 파일입니다. 단, 일부 구분 쉼표 뒤에 공백이 있습니다(이로 인해 필드 인용이 엉망이 됩니다 Address
. 인용된 필드에는 구분 기호 바로 뒤에 초기 인용 문자가 포함되어야 합니다). csvformat
(csvkit의 일부)를 사용하여 이를 수정할 수 있습니다 .https://csvkit.readthedocs.io/en/latest/):
$ csvformat --skipinitialspace file.csv >fixed-file.csv
$ cat fixed-file.csv
First Name,Last Name,Address,Phone Number
John,Doe,"House # 11, Street xyz, Road, Area",00000000
Sara,Taylor,"Jake Lake%, Apartment #22, Main Road, Area XYZ",00000000
CSV를 구문 분석할 수 있는 데이터베이스는 있는 그대로 읽을 수 있어야 합니다.
포함된 모든 쉼표를 로 바꾸시겠습니까 |
? 파일 구분 기호를 쉼표가 아닌 다른 것으로 변경하고(아래 탭을 사용하겠습니다) 나머지 쉼표를 모두 파이프로 변경한 다음 다시 다시 변경하십시오. 쉼표를 구분 기호로 사용하십시오.
원시 데이터에서 직접 이 작업을 수행할 수 있습니다.
$ csvformat --skipinitialspace --out-tabs file.csv | tr ',' '|' | csvformat --tabs >fixed-file.csv
$ cat fixed-file.csv
First Name,Last Name,Address,Phone Number
John,Doe,House # 11| Street xyz| Road| Area,00000000
Sara,Taylor,Jake Lake%| Apartment #22| Main Road| Area XYZ,00000000
사용되는 긴 옵션의 다양한 짧은 변형은 -S
for --skipinitialspace
, -T
for --out-tabs
및 -t
for 입니다 --tabs
.