Dividindo arquivos no Unix usando valores em um arquivo [closed]

1

Eu tenho um arquivo txt que tem vários registros XML. Eu tenho que separar usando vendorname . Eu modifiquei os comandos conforme minha exigência. No entanto, está me dando duas mensagens de erro:

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

se eu adicionar um \ na frente de . , ele me dará outra mensagem de erro

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

Script

/<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
    }
  }
    
por James 17.11.2016 / 20:50

1 resposta

0

Você precisa cortar as barras em http:// , não apenas a primeira.

Assim, a correspondência de padrões deve ser semelhante,

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

Além disso, na sua chamada para split() ,

  1. você não deve excluir a barra invertida nas barras da seqüência de caracteres;
  2. você deve excluir aspas duplas ( " ) após v1 .

Portanto, a string em split() deve ser semelhante,

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