파일의 값을 사용하여 Unix에서 파일 분할 [닫기]

파일의 값을 사용하여 Unix에서 파일 분할 [닫기]

여러 개의 XML 레코드가 포함된 txt 파일이 있습니다. 를 이용하여 분리해야 합니다 vendorname. 내 요구 사항에 따라 명령을 수정했습니다. 그러나 2개의 오류 메시지가 나타납니다.

awk: sf.awk:1: /<hdr:vendorname xmlns:hdr=\"http:\//www.mycompany.com\/header\/v1\">[A-Z]+<\/hdr:vendorname>/{
awk: sf.awk:1:                                         ^ syntax error
awk: sf.awk:1: /<hdr:vendorname xmlns:hdr=\"http:\//www.mycompany.com\/header\/v1\">[A-Z]+<\/hdr:vendorname>/{
awk: sf.awk:1:                                                               ^ backslash not last character on line

\앞에 하나를 추가 하면 .또 다른 오류 메시지가 나타납니다.

awk: sf.awk:1: /<hdr:vendorname xmlns:hdr=\"http:\//dwh\.www.mycompany.com\/header\/v1\">[A-Z]+<\/hdr:vendorname>/{
awk: sf.awk:1:                                         ^ backslash not last character on line

스크립트

/<hdr:vendorname xmlns:hdr=\"http:\//www.mycompany.com\/header\/v1\">[A-Z]+<\/hdr:vendorname>/{
    split($0, a, "hdr:vendorname xmlns:hdr=\"http:\//www.mycompany.com\/header\/v1">|<\/hdr:vendorname")
    if (out["file_"a[2]".txt"] == "") {
      out["file_"a[2]".txt"] = $0
    }
    else {
      out["file_"a[2]".txt"]=out["file_"a[2]".txt"]"\n"$0
    }
  }

END {
    for (fic in out) {
      printf out[fic] > fic
    }
  }

답변1

백슬래시 이스케이프가 필요합니다.둘 다slash http://, 첫 번째 것만이 아닙니다.

따라서 패턴 매칭은 다음과 같아야 합니다.

/<hdr:vendorname xmlns:hdr=\"http:\/\/www.mycompany.com\/header\/v1\">[A-Z]+<\/hdr:vendorname>/

split()게다가 전화할 때

  1. 문자열에서 슬래시를 백슬래시로 이스케이프하면 안 됩니다.
  2. 백슬래시로 다음 큰따옴표( ") 를 이스케이프 처리해야 합니다 v1.

따라서 문자열은 split()다음과 같아야 합니다.

"hdr:vendorname xmlns:hdr=\"http://www.mycompany.com/header/v1\">|</hdr:vendorname"

관련 정보