ファイルの値を使用して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

\前に1つを追加すると、.別のエラーメッセージが表示されます。

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"

関連情報