147347
Goto Top

Cvs Datei mit ISBN Rechnung

Hallo.
Ich muss mithilfe eines Shellscriptes in einer cvs Datei auf eine jeweilige Spalte zugreifen. In diesem Fall die Spalte wo die ISBN Nummern stehen.

Die Aufgabe lautet:
Es sollen alle in der Datenbank eingetragenen ISBNs geprueft werden. Diese sind ¨entweder zehn- oder dreizehnstellig und durfen nur Ziffern enthalten (Ausnahme: die letzte Stelle der zehnstelligen ISBN kann ein ’X’ enthalten, das der 10 entspricht) Bindestriche sind zu ignorieren. Fur jede zehnstellige ISBN mit den ¨Ziffern z0z1z2...z9 pruefen Sie bitte, ob folgende Bedingung wahr ist: ¨ z0 + 2z1 + 3z2 + 4z3 + 5z4 + 6z5 + 7z6 + 7z7 + 9z8 + 10z9 mod 11 = 0
Bei Verletzung dieser Bedingung geben Sie die fehlerhafte ISBN mit einer deskriptiven Fehlermeldung aus, genauso bei falscher Groeße oder falschen Ziffern.

Die ISBN mit falscher Groeße oder falschen Ziffern konnte ich ausgeben. Jedoch macht mir die modulo prüfung probleme, da ich nicht gebnau weiß wie ich auf die einzelnen Stellen der Zahlen zufgreifen kann.

Mein derzeitiger Code lautet:

if [ "$1" = "isbn" ] && [ "$2" = "" ]; then

isb1="[0-9]{10}"
isb2="[0-9X]"
isb3="[0-9]-[0-9]{2,3}-[0-9]{5,6}-[0-9]" # Alle regulären Ausdrücke für die ISBN
isb4="[0-9]{3}-[0-9]-[0-9]{6}-[0-9]{2}-[0-9]"
isb5="[0-9]{13}"
isb="$isb1|$isb2|$isb3|$isb4|$isb5"

let1="[A-W][Y-Z]"

echo "Error: fehlerhafte ISBN:";

isbn="$isb1|$isb2|$isb3"


awk -v nu=$isbn s=0 -F ';' '{
for (i=1; i<=10; i++) { if(i==1) sum=0
if($i == "X" ){ sum=sum+(10i)}
else { sum=sum+($ii) }
if( sum%11!=0 && i==10 && $8 ~ nu && length($8)==10) {print substr($8,i,1)}}}' bib.csv

Mit substr will ich jede einzelne Ziffer "ausschneiden". Aber ich bekomme den Fehler: awk: fatal: cannot open file `-F' for reading.
Wo liegt der Fehler? oder gibt es noch einen besseren Ansatz?
Entschuldigung für die Formatierung und Vielen Dank im Voraus.

Content-Key: 642058

Url: https://administrator.de/contentid/642058

Ausgedruckt am: 28.03.2024 um 15:03 Uhr

Mitglied: 147347
147347 19.01.2021 um 14:17:54 Uhr
Goto Top
Ergänzung: die * Zeichen wurden nicht kopiert bei den i's

Also: sum=sum+(10*i)
und sum=sum+($i*i)
Mitglied: brammer
brammer 19.01.2021 aktualisiert um 14:29:06 Uhr
Goto Top
Hallo,

setzte den Code bitte mal in Code Tags.
Links neben dem Beitrag sollte die
Option "Codeblock hinzufügen" sein

brammer
Mitglied: 147347
147347 19.01.2021 um 14:50:01 Uhr
Goto Top
 
if [ "$1" = "isbn" ] && [ "$2" = "" ]; then  

isb1="[0-9]{10}"  
isb2="[0-9X]"  
isb3="[0-9]-[0-9]{2,3}-[0-9]{5,6}-[0-9]" # Alle regulären Ausdrücke für die ISBN  
isb4="[0-9]{3}-[0-9]-[0-9]{6}-[0-9]{2}-[0-9]"  
isb5="[0-9]{13}"  
isb="$isb1|$isb2|$isb3|$isb4|$isb5"  

let1="[A-W][Y-Z]"  

echo "Error: fehlerhafte ISBN:";  

isbn="$isb1|$isb2|$isb3"  

awk -v nr=$isb -v b=$let1 -F ';' '{  
          if( $8 ~ nr && length($8)!=10 && length($8)!=13 || $8 ~ b) {print $8}
 }' bib.csv                                      # ISBN falscher Länge und Zeichen augegeben  

awk -v nu=$isbn s=0 -F ';' '{  
                 for (i=1; i<=10; i++) { 
                                   if(i==1) sum=0
                                     
                                    if($i == "X" ) { sum=sum+(10*i) }  
                                    else { sum=sum+($i*i) }
                                    if( sum%11!=0 && i==10 && $8 ~ nu && length($8)==10) {print substr($8,i,1)}
                   }
}' bib.csv