Anzeige:
Ergebnis 1 bis 13 von 13

Thema: awk regexp problem

  1. #1
    Registrierter Benutzer
    Registriert seit
    05.05.2004
    Beiträge
    212

    awk regexp problem

    ich habe folgendens scirpt geschrieben
    Code:
    $1~/[0-9]\{7\}\-[0-9]\{3\}/p {
    print $1
    }
    dies rufe ich mit
    Code:
    awk -f con.awk datei
    und dann erhalte ich folgendes ergebnis
    Code:
    4152312-009-00029/002.006
    70015
    7152307
    7152308
    715261004
    715261024
    715261050
    715261051
    715261060
    warum? eigentlich dürfte ich doch nur das erste kriegen

    thx cu SHB

  2. #2
    Registrierter Benutzer Avatar von Hans-Georg Normann
    Registriert seit
    04.03.2000
    Ort
    Uetersen
    Beiträge
    571
    Möglich, dass du mal einen Auszug von "datei" schickst?

    Was willst du daraus extrahieren?

    Hans
    333 Mhz, 466 MHz, neee, ich hab was neues zuhause.....

  3. #3
    Registrierter Benutzer
    Registriert seit
    05.05.2004
    Beiträge
    212
    hier ist ein auszug
    4152312-009-00029/002.006 Z 152312-00443 0191 0N10001.00.00.00.00 0 82 0016
    4152312-009-00029/002.006 Z 152312-00443 0191 0N10001.00.00.00.00 1E.d.V.; RT: LPG (P)
    4152312-009-00029/002.006 Z 152312-00443 0191 0N10001.00.00.00.00 2Schafst~Ddt
    70015 A00Lieg.kat.f~Ahrende Stelle 9Halle
    7152283 15261004 1105 B09Groágr~Dfendorf
    7152286 15261024 1105 B09Klobikau
    7152307 15261050 1105 B09Schafst~Ddt
    7152308 15261051 1105 B09Schkopau
    ach ja mit sed klappt es.
    solche zahlen will ich 4152312-009-00029/002.006 Z und davon hab ich genung zahlen

    Code:
    sed -n '/^[0-9]\{7\}-[0-9]\{3\}-[0-9]\{5\}\/[0-9]\{3\}\.[0-9]\{3\}\ [A-Z]/p' datei
    thx cu SHB

  4. #4
    Registrierter Benutzer Avatar von Hans-Georg Normann
    Registriert seit
    04.03.2000
    Ort
    Uetersen
    Beiträge
    571
    Ich muss, gestehen, ich versteh deine RegEx nicht Aber das soll nicht heissen, dass sie falsch ist.

    Mein Vorschlag: Zieh doch das ganze einmal auseiander, soll heissen, bau dir Funktionen. Dann wird es vielleicht etwas einfacher. Hier mal ein Scripts, was ich geschrieben habe. Das sollte bestimmte Zeilen überlesen und den Rest in eine Textdatei schreiben. Gegeben war in meinem Fall eine Textdatei mit Dateinamen. Ich benötigte alle Zeilen, die in der Textdatei mit ./infosheet/ begannen.
    Code:
    BEGIN {
      System_Init()
    }
    
    /^\.\/infosheet/ {
         UAPFILE=$0
         TEXTFILE=(UAPFILE ".txt")
         # fTIME=strftime("%T %Z")
         fTIME="-- "
         printf "%s: converting file: %s\n", fTIME, $0
         Uniplex_Convert()
    }
    
    function System_Init() {
      false=0
      true=!false
    }
    
    function Uniplex_Convert() {
      EFFECT=false
    
      while (getline < UAPFILE > 0) {
        TEXT=$0
        if (TEXT=="") {
          print "\r" > TEXTFILE
        }
    
        if (EFFECT) {
          EFFECT=false
          continue
        }
    
        # nex line contains fontattributes
        MATCH=substr(TEXT,length(TEXT)-1)
        if (MATCH == "@@") {
          TEXT=substr(TEXT,1,length(TEXT)-2)
          EFFECT=true
          print (TEXT "\r") > TEXTFILE
          continue
        }
    
        # UAP Tabulator
        if (index(TEXT,"....T....") > 0){
          continue
        }
    
        print (TEXT "\r") > TEXTFILE
      }
    
        # UAP Tabulator
        if (index(TEXT,"....T....") > 0){
          continue
        }
    
        print (TEXT "\r") > TEXTFILE
      }
    
      close(UAPFILE)
      close(TEXTFILE)
    }
    Hans
    333 Mhz, 466 MHz, neee, ich hab was neues zuhause.....

  5. #5
    Registrierter Benutzer
    Registriert seit
    05.05.2004
    Beiträge
    212
    gut ich werd dir mein regexp mal erklären
    Code:
    / einleitung bei sed /awk 
    ^ vom anfang der zeile lesen 
    [0-9]\{7\}  von 0-9 die genau 7  (unterschiedliche) zahlen hinterheinander
    - Bindestrich
    [0-9]\{3\} von 0-9 die genau 3  (unterschiedliche) zahlen hinterheinander
    - Bindestrich
    [0-9]\{5\} von 0-9 die genau 5  (unterschiedliche) zahlen hinterheinander
    \/ ein slash
    [0-9]\{3\} von 0-9 die genau 3  (unterschiedliche) zahlen hinterheinander
    \. ein Punkt
    [0-9]\{3\} von 0-9 die genau 3  (unterschiedliche) zahlen hinterheinander
    \  eine leertaste
    [A-Z] ein großbuchstabe zwischen A und Z
    / ende von sed/awk
    p keine ahnung für was das p, aber ohne geht es nicht
    ich wollte das ganze aber auf diese art machen, ich kann mir nicht vorstelln, das awk das nicht ordentlich beherscht ;( "einfache" regexp macht er ja

    thx cu SHB

  6. #6
    Registrierter Benutzer Avatar von Hans-Georg Normann
    Registriert seit
    04.03.2000
    Ort
    Uetersen
    Beiträge
    571
    oops, die Bedeutung von {nummer} war mir im Zusammenhang mit RegEx nicht bekannt.

    Habe das Ganze mal aufgedröselt. Dazu gibt es zwei Funktionen. Jede liefert hoffentlich das richtige Erfebnis. Ist natürlich Ausbaufähig.
    Code:
    /^[0-9]\{7\}\-[0-9]\{3\}/p {
       #print $1
       checkLength1($1)
    }
    
    function checkLength(fValue) {
      if (length(fValue) >= 11) {
        if ((substr(fValue,8,1) == "-") && (substr(fValue,12,1)) == "-") {
          print fValue
        }
      }
    }
    
    function checkLength1(fValue) {
      if (length(fValue) <= 11)       { exit 0 }
      if (substr(fValue,8,1) != "-")  { exit 0 }
      if (substr(fValue,12,1) != "-") { exit 0 }
      print fValue
    
    }
    Die Syntax sollte eigentlich kein Problem darstellen.

    Hans
    333 Mhz, 466 MHz, neee, ich hab was neues zuhause.....

  7. #7
    Registrierter Benutzer
    Registriert seit
    05.05.2004
    Beiträge
    212
    mmm gut die erste funktion geht, aber was mich so stört ist, dass der regexp nicht geht, selbst wenn ich das ganze hart schreibe
    Code:
    /[0-9][0-9][0-9][0-9][0-9][0-9][0-9]\-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9]\/[0-9][0-9][0-9][0-9]/
    kommen solche ergebnisse mit raus
    Code:
    19915D9956
    thx cu SHB

  8. #8
    Registrierter Benutzer Avatar von Hans-Georg Normann
    Registriert seit
    04.03.2000
    Ort
    Uetersen
    Beiträge
    571
    Code:
    /^.......-...-/ {
       print $1
    }
    bringt schon mal ein besseres Ergebnis, auch ohne das p nach der RegEx
    Code:
    [hans@rosi tmp]$ awk -f xyz.awk xyz.txt
    4152312-009-00029/002.006
    4152312-009-00029/002.006
    Wie setzt man eigentlich

    Hans
    Code:
    /[[:digit:]]/
    ein? Bin da aus dem Manual nicht so ganz schlau geworden.

    Hans
    333 Mhz, 466 MHz, neee, ich hab was neues zuhause.....

  9. #9
    Registrierter Benutzer Avatar von Hans-Georg Normann
    Registriert seit
    04.03.2000
    Ort
    Uetersen
    Beiträge
    571
    TaDaaaa

    Geht doch doch! Manpages verraten unter Expression folgendes
    r{n}
    r{n,}
    r{n,m} One or two numbers inside braces denote an interval expression. If there is one number in the braces, the preceding regular expression r is repeated n times. If there are two numbers separated by a comma, r is repeated n to m times. If there is one number followed by a comma, then r is repeated at least n times.

    Interval expressions are only available if either - -posix or - -re-interval is specified on the command line.
    Das ganze sieht dann so aus:
    Code:
    /^[0-9]{7}-[0-9]{3}-[0-9]{5}/ {
       print $1
    }
    und jetzt noch der Aufruf
    Code:
    [hans@rosi tmp]$ awk --posix -f xyz.awk xyz.txt
    4152312-009-00029/002.006
    4152312-009-00029/002.006
    [hans@rosi tmp]$
    Noch Fragen?

    Hans
    333 Mhz, 466 MHz, neee, ich hab was neues zuhause.....

  10. #10
    Registrierter Benutzer
    Registriert seit
    05.05.2004
    Beiträge
    212

    super, danke

    aber warum --posix?

    thx cu SHB

  11. #11
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Naja, für AWK gibts einen Posix-Standard, ist vermutlich also dort drin.
    Aber wieso der Parameter jetzt nötig ist (und erst bei so was nützlichem) weiss ich jetzt auch gerade nicht - eine der wenigen Ausnahmen wo sich die GNU-Tools negativ vom Standard abheben.

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  12. #12
    balduin
    Gast
    Hi,

    Der Parameter --posix ist notwendig, damit awk die Interval- und Mengenangaben {x,y} interpretiert, soweit ich weiß.

    gruß,
    balduin

  13. #13
    Registrierter Benutzer
    Registriert seit
    26.12.2002
    Ort
    Matrix
    Beiträge
    194
    Zitat Zitat von shb
    ich wollte das ganze aber auf diese art machen, ich kann mir nicht vorstelln, das awk das nicht ordentlich beherscht ;( "einfache" regexp macht er ja
    awk kann das schon:

    awk --posix '$1 ~ /[0-9]{7}-[0-9]{3}/ {print $1}' file

    oder

    awk --re-interval '$1 ~ /[0-9]{7}-[0-9]{3}/ {print $1}' file

    dein problem sind die interval expressions {}. die kann standard-awk nicht. --re-interval (in --posix enthalten) schaltet diese an.


    -j

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •