AWK 명령 매개변수 오류

AWK 명령 매개변수 오류

학생의 연락처 정보가 포함된 데이터세트가 있는데, 샘플 데이터세트는 다음과 같습니다.

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

  1. 견고성을 위해 절대 이 작업을 수행하지 말고 printf $0항상 printf "%s", $0그 반대를 사용하십시오. 입력에 형식 문자가 포함된 경우 전자는 실패하므로 printf(현재 보고 있는 대로) printf모든 입력 데이터를 사용하는 경우에도 동일하게 적용됩니다 .
  2. RFS명확성과 견고성을 위해, 예를 들어 내장 변수 이름과의 충돌을 피하고 내장 변수를 사용하지 않을 때 내장 변수를 사용하는 것처럼 보이게 하여 코드 혼동을 피하기 위해 변수 이름 전체를 대문자로 사용하지 마십시오 .
  3. 가독성을 위해 예를 들어 스크립트 뒤에 변수를 설정하지 마십시오 RS. 다른 입력 파일에 대해 다른 값으로 설정해야 하는 경우가 아니면 스크립트 앞이나 시작 부분에 변수를 설정하여 스크립트가 실행될 때 볼 수 있도록 하세요. 스크립트가 읽혀졌습니다. 스크립트가 사용되는 것을 보기 전에 설정됩니다.
  4. 효율성, 단순성 및 견고성을 위해 *sub()의 첫 번째 매개변수는 문자열이 아닌 정규식이므로 지정하지 않는 한 /.../문자열( ) 구분 기호 대신 정규식( "...")을 사용하십시오. 어떤 이유로 정적 정규식이 아닌 동적 필요합니다.
  5. 명확성과 유지 관리 용이성을 위해 및 와 같이 동일한 값을 가져야 하는 두 개의 변수가 있는 경우 RSRFS같이 개별적으로 동일한 값으로 설정하거나 또는 다음 중 하나와 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

사용되는 긴 옵션의 다양한 짧은 변형은 -Sfor --skipinitialspace, -Tfor --out-tabs-tfor 입니다 --tabs.

관련 정보