• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Etikettendruck mit Script

Hallo Leute!

Vielleicht könnt ihr mir ja ein wenig helfen. Ich möchte auch gar nicht unbedingt eine fertige Lösung zu meinem Problem, einfach nur ein Tip, welche Befehle ich wie einsetzen kann, wäre auch schon gut! ;)

Zum "Problem":
Ich soll ein Shell Script schreiben, bei dem man sich aussuchen kann, welche Adresse/n wie oft gedruckt werden sollen. Dabei habe ich noch die Auswahlmöglichkeit wieviele Bahnen ich haben möchte...
Beispiel:
Adresse1
A2
A3

oder:
A1 A1 A2 A2
A3 A3 A4 A4

etc...

Man kann bis zu vier Bahnen wählen.
Die Adressen befinden sich übrigens in einer Textdatei. Bei fünf Adressen würd ichs ja noch so hinbekommen mit viel Tipparbeit, aber ich soll mit etwa hundert oder mehr Schriften rechnen. Und dann soll das immernoch alles reibungslos klappen.
Das ganze wäre vllt. nicht so ein großes Problem für mich, wenn ich hier im Praktikum mal einen Ansprechpartner hätte, der ständig da ist. Blöd nur, wenn der einzige Ansprechpartner, der Ahnung von Linux hat, Vertretung für Abteilungsleiter machen muss. (Bin in einem RIESIGEN Unternehmen)
Ich verzweifle schon bei solchen Sachen wie Schleifen (while) etc...
Im Netz kann ich auch nichts "einfaches" finden. :-/

Danke schonmal:)
 
A

Anonymous

Gast
Das ist gar nicht so einfach, da kann man bestimmt eine Doktorarbeit draus machen. Nomalerweise macht man sowas über eine Adressdatenbank oder so. Aber du willst es ja über die Konsole bringen.

Ich fang hier einfach mal an, vielleicht kommt ja der eine oder andere oder sogar Onkel TeXpert noch, der macht sowas jeden Tag, allerdings wahrscheinlich mit Perl.

Nehmen wir mal an du hast 20 Adressendateien A1 bis A20.
In jeder steht eine Adresse als Dreizeiler

Erst mal versuchen wir das ohne jede Auswahlmöglichkeit und jede Adresse genau ein Mal in 4 Spalten zu formatieren. Da gehts schon los, ist gar nicht so einfach

Code:
ls A* | while read A ; read B ; read C ; read D
do
   cat $A >> Sammel_1
   cat $B >> Sammel_2
   cat $C >> Sammel_3
   cat $D >> Sammel_4
  
   for i in 1 2 3 4
      do
        echo >> Sammel_$i
        echo >> Sammel_$i
    done
done
pr -m Sammel_?
rm Sammel_?

Sicher nicht vollkommen, aber zur Diskussion frei

robi
 
das ist wirklich ein komplexeres Problem :)

also ich würde das wahrscheinlich nicht manuell auf der Shell lösen wollen... und wenn doch, dann würde ich mal ganz spontan nach passenden LaTeX-Klassen suchen (envlab könnte Dir gefallen --> http://tug.ctan.org/info?id=envlab)

wenn einem das nicht reicht... direkt einzelne Adressen formatieren udn dann positionieren, dazu würde ich mit entsprechenden libs auf PDF oder PS-Ebene runtergehen.

Begründung: das Problem ist nicht das Auswählen, sondern die Seitenformatierung... und dazu würde ich immer auf Hilfsmittel zurückgreifen.
 
A

Anonymous

Gast
Ich hab mein Script noch mal überarbeitet
Code:
#! /bin/bash
typeset -i ANZAHL
typeset -i SPALTEN
SPALTEN=$2
ANZAHL=$1

ls A* | while read A 
do
 for i in `seq 1 $ANZAHL` 
  do
    cat $A >> Sammel_1 ; echo -e "\n\n" >> Sammel_1 
  done

  if [ $SPALTEN -ge 2 ] 
  then 
   read B
   for i in `seq 1 $ANZAHL` 
   do
    cat $B >> Sammel_2 ; echo -e "\n\n" >> Sammel_2 
   done
  fi
  
  if [ $SPALTEN -ge 3 ] 
  then
   read C 
   for i in `seq 1 $ANZAHL` 
   do
      cat $C >> Sammel_3 ; echo -e "\n\n" >> Sammel_3 
   done
  fi

  if [ $SPALTEN -ge 4 ]
  then
   read D 
   for i in `seq 1 $ANZAHL` 
   do
       cat $D >> Sammel_4 ; echo -e "\n\n" >> Sammel_4 
   done
  fi
  
done
pr -m -t -w70 -s'|' Sammel_?
rm Sammel_?

Aufgerufen wird es
Code:
./script ANZAHL SPALTEN
wobei ANZAHL die Anzahl jeder Aufkleber pro Adresse ist und Spalten (1 bis 4 ) die Anzahl der Spalten mit denen gedruckt werden soll.
Unter der Voraussetzung jede Adresse 3 Zeilen und keine überlange Zeilen, siehts schon net aus, zumindestens die Ausgabe, das Script hat natürlich noch zu viele Wiederholungen, das richt förmlich nach einer Funktion. Notfalls noch etwas mit dem pr Befehl rumspielen. Was der Drucker dazu sagt, hab ich allerdings nicht ausprobiert.

robi
 
Erstmal Sorry, dass ich den Thread zunächst ins falsche Forum gestellt habe!
Ja, ich finde die Aufgabe auch etwas sehr komplex für ein Shell Script...
Der Herr Programmierer erzählte mir aber, dass er sich mit diesem System immer ansieht ob er eine neue Sprache beherrscht. :?

Ausgedruckt werden soll das Ganze übrigens nicht! Er meinte, dass es reicht wenn es am Bildschirm "ausgedruckt" wird.
Sprich: Es reicht, wenn die Adressen so angezeigt werden, wie wenn sie gedruckt würden...
Naja, auf jeden Fall erst einmal vielen Dank! Jetzt habe ich zumindest einen Ansatz.
Neue Vorschläge nehme ich trotzdem gerne entgegen! ;)
 
robi schrieb:
Ich fang hier einfach mal an, vielleicht kommt ja der eine oder andere oder sogar Onkel TeXpert noch, der macht sowas jeden Tag, allerdings wahrscheinlich mit Perl.
Perl ist doch schon mal eine gute Idee. Dort hat man nämlich schon ein paar Sachen zum Formulardruck zur Auswahl.

@Lord_Levithanius: Hättest du ein paar Beispieldatensätze aus der Adressdatei?
 
@notoxp:

Hier die Adressliste...Das sind nicht viele, aber das System soll halt auch funktionieren, wenn es 100 oder mehr Adresse sind... Und bitte nicht über die Adressen wundern! ;) Es soll ja bloß funktionieren...

Code:
Jack Daniels
Verköstung
Blaue Allee 15
29640 Schneverdingen

Susanne Sorglos
Verwaltung
Jodel Str. 21
29640 Schneverdingen

Markus Mustermann
Muelltrennung
Musterstrasse 77
29614 Soltau

Otto Mueller
Abteilung bla
abcstrasse 1
12345 stadt

Hans Wurst
Abteilung 3
blabla weg 7
56789 quasselstadt
 
Lord_Levithanius schrieb:
@notoxp:

Hier die Adressliste...Das sind nicht viele, aber das System soll halt auch funktionieren, wenn es 100 oder mehr Adresse sind... Und bitte nicht über die Adressen wundern! ;) Es soll ja bloß funktionieren...
Ich hätte da noch eine Frage: Ist das Format der Eingabedatei vorgegeben, oder ist das dein Vorschlag?

Ansonsten hätten wir nämlich folgendes Problem: Man liest die Eingabedatei zeilenweise. Das heißt, man muss immer zur ersten Leerzeile lesen um eine komplette Adresse zu haben und sich dabei die alten Zeilen merken. Sodann muss man ja immer so viele Adressen lesen, dass alle Bahnen des Etikettenformulars ausgefüllt sind. Also wenn es 3 Bahnen sind, musst du immer 3 Adressen lesen, bevor du eine Etikettenzeile ausgibst.

In Summe musst du also Zeilen und Bahnen "merken", d.h. in einer Datenstuktur ablegen. Normalerweise macht man das mit einer Zweidimensionalen Tabelle (1. Dimension: Zeilen, 2. Dimension: Bahnen) oder auch "Array" genannt.

Das blöde ist: Soviel ich weiß kann die Linux-Shell (bash) nur eindimensionale Arrays. Jede Menge anderer Script- und Programmiersprachen sind hier flexibler. Natürlich kann man sich auch mit der bash einen Workaround ohne Array bauen, aber das wird wirklich nicht mehr schön...

Deshalb mein Vorschlag: Entweder das Format Eingabedatei verändern oder die Scriptsprache wecheln (z.B. von shell auf perl).
Vielleicht kommen auch noch andere Vorschläge...
 
Das blöde ist ja, dass ich es mit der shell machen muss! kein perl, kein C, kein gar nix :(
Mir wurde nicht gesagt, dass das Adressformat genau so sein soll. Nur, dass es immer vierzeilige sein sollen:

Vorname Nachname
Abteilung
Strasse 12
12345 Ort

Wie sollte ich denn die Adressen abändern, damit das funktioniert? Der niemals anwesende Programmierer hier hat das bestimmt auch hinbekommen...Glaub ich...Vielleicht :?
 
Lord_Levithanius schrieb:
Das blöde ist ja, dass ich es mit der shell machen muss! kein perl, kein C, kein gar nix :(
OK!
Wie sollte ich denn die Adressen abändern, damit das funktioniert? Der niemals anwesende Programmierer hier hat das bestimmt auch hinbekommen...Glaub ich...Vielleicht :?
Wie gesagt kann man das ohne Zweifel hinbekommen. Nur wird das denke ich unnötig kompliziert...
Mein erster Ansatz hierzu währe folgender Code:
Code:
cat Adressen.txt | 
while read zeile
do
  echo $zeile
done
So liest man die Datei "Adressen.txt" zeilenweise durch. Nach meiner Denke wäre es gut, wenn man in einer Zeile gleich die ganze Adresse hätte. Wenn ich aussuchen könnte würde ich folgendes wählen. So ähnlich würden nämlich die Daten aussehen, wenn sie aus einer Datenbank kämen:
Code:
Daniels;Jack;Verköstung;Blaue Allee;15;29640 Schneverdingen
Die Einzelnen Felder bzw. Adresszeilen werden durch ein Semikolon getrennt. Das ist durchaus üblich. Man kann es sich natürlich auch einfacher machen, und die Adresszeilen gleich aufbereitet bekommen
Code:
Jack Daniels;Verköstung;Blaue Allee 15;29640 Schneverdingen
Im letzten Fall würde man dann so durchlesen:
Code:
IFS=";
"               # Semikolon ist Feldtrenner. Wichtig: Newline muss dabei sein
cat Adressen.txt |
while read zeile1 zeile2 zeile3 zeile4 rest
do
  echo $zeile1
  echo $zeile2
  echo $zeile3
  echo $zeile4
done
Um es nochmals zu wiederholen: Es würde auch die von dir Vorgeschlagene Version gehen. Aber das macht es nicht einfacher...
 
notoxp schrieb:
Das blöde ist: Soviel ich weiß kann die Linux-Shell (bash) nur eindimensionale Arrays. Jede Menge anderer Script- und Programmiersprachen sind hier flexibler. Natürlich kann man sich auch mit der bash einen Workaround ohne Array bauen, aber das wird wirklich nicht mehr schön...

naja, Array-Flattening ist bei 2 Dimensionen nicht wirklich das Problem, einfach eine kleine Funktion nehmen, die die Indizes ausrechnet
Pseudocode:
Code:
function ArrayPos(i, j) {
    return j*I_max + i;
}
das ist bei 2 Dim nun nicht wirklich ein Problem ;) und wer ein Beispiel sehen, will: latürnich im Advanced-Shell-Scripting-Guide --> Arrays

aber jetzt verstehe ich auch die Aufgabe besser ;) kurz gesagt:
Der Herr Programmierer erzählte mir aber, dass er sich mit diesem System immer ansieht ob er eine neue Sprache beherrscht.
bitte richte dem Herrn Programmierer einen schönen Gruß von mir aus: Gute Idee und netter Test...

jetzt zum Problem, überleg Dir erst mal, wie Du das theoretisch löschen möchtest, Bash ist eine reine imperative Sprache, d.h. Du kannst mit simplen Nassi-Shneyderman oder Flussdiagrammen den Ablauf planen, das Umsetzen ist nachher dann trivial... Eingabe = read, Ausgabe=echo, Datenstruktur... das hatten wir ja schon ;)

wenn es nicht wirklich auf den Drucker gehen soll dann ist das auch wunderbar mit der Bash zu machen... d.h. die Aufgabe besteht nur darin das 2-Dim Feld geeignet zu füllen und anschließend darüber zu iterieren...
 
Lord_Levithanius schrieb:
Hmm...Also die letzte Idee klappt ja prima, aber wie realisiere ich das jetzt mit den mehreren Spalten?:?

Spaltenzahl einlesen, und dann entsprechend 2-dim-Feld aufbauen und beim echo wieder entsprechend reagieren...

Dein Problem ist z.zt. nicht die Bash sondern der Algorithmus. Tu Dir selber einen Gefallen und tausch das Keyboard mit papier und Bleistift, bis das Verfahren klar ist ;)...
 
:p Ja, ich habe so meine Probleme ;)
Aber ich wurde hier ins kalte Wasser geschmissen...Kein Mensch, der sich damit auskennt, hat hier Zeit für mich :cry:
Memo an mich selbst: Kleinere Unternehmen bevorzugen! ;)
 
dann nimm Dir meinen Rat mit dem Bleistift zu Herzen ;) wenn die Skizze klappt dann formulier das in einem Pseudocode und den überträgst Du dann mit der manpage und den Bash-Guides die es im Netz gibt in die Konkrete Version... (das ist dann nicht mehr wirklich schwer, auch sind hier in dem Thread schon einige Ideen ...)
 
Ich werde mir deinen Rat zu Herzen nehmen, TeXpert! ;)
Trotzdem vielen Dank an robi, notoxp und dich!
Durch euch habe ich wenigstens einige brauchbare Ansätze erhalten! :)
 
A

Anonymous

Gast
versuche so einfach und stukturiert wie möglich zu denken,
hier mal ein kleiner Anreiz zur 120%igen Motivation
Code:
robi@linux:/home/robi/test > ./script 2 3 adressen



Jack Daniels          |Susanne Sorglos       |Markus Mustermann
Verköstung            |Verwaltung            |Muelltrennung
Blaue Allee 15        |Jodel Str. 21         |Musterstrasse 77
29640 Schneverdingen  |29640 Schneverdingen  |29614 Soltau
                      |                      |
------------------    |------------------    |------------------
Jack Daniels          |Susanne Sorglos       |Markus Mustermann
Verköstung            |Verwaltung            |Muelltrennung
Blaue Allee 15        |Jodel Str. 21         |Musterstrasse 77
29640 Schneverdingen  |29640 Schneverdingen  |29614 Soltau
                      |                      |
------------------    |------------------    |------------------
Otto Mueller          |Hans Wurst            |
Abteilung bla         |Abteilung 3           |
abcstrasse 1          |blabla weg 7          |
12345 stadt           |56789 quasselstadt    |
                      |                      |
------------------    |------------------    |
Otto Mueller          |Hans Wurst            |
Abteilung bla         |Abteilung 3           |
abcstrasse 1          |blabla weg 7          |
12345 stadt           |56789 quasselstadt    |
                      |                      |
------------------    |------------------    |

robi
 
A

Anonymous

Gast
bis 4 Spalten habe ich berücksichtigt

Code:
robi@linux:/home/robi/test> ./script 3 2 adressen



Jack Daniels                      |Susanne Sorglos
Verköstung                        |Verwaltung
Blaue Allee 15                    |Jodel Str. 21
29640 Schneverdingen              |29640 Schneverdingen
                                  |
------------------                |------------------
Jack Daniels                      |Susanne Sorglos
Verköstung                        |Verwaltung
Blaue Allee 15                    |Jodel Str. 21
29640 Schneverdingen              |29640 Schneverdingen
                                  |
------------------                |------------------
Jack Daniels                      |Susanne Sorglos
Verköstung                        |Verwaltung
Blaue Allee 15                    |Jodel Str. 21
29640 Schneverdingen              |29640 Schneverdingen
                                  |
------------------                |------------------
Markus Mustermann                 |Otto Mueller
Muelltrennung                     |Abteilung bla
Musterstrasse 77                  |abcstrasse 1
29614 Soltau                      |12345 stadt
                                  |
------------------                |------------------
Markus Mustermann                 |Otto Mueller
Muelltrennung                     |Abteilung bla
Musterstrasse 77                  |abcstrasse 1
29614 Soltau                      |12345 stadt
                                  |
------------------                |------------------
Markus Mustermann                 |Otto Mueller
Muelltrennung                     |Abteilung bla
Musterstrasse 77                  |abcstrasse 1
29614 Soltau                      |12345 stadt
                                  |
------------------                |------------------
Hans Wurst                        |
Abteilung 3                       |
blabla weg 7                      |
56789 quasselstadt                |
                                  |
------------------                |
Hans Wurst                        |
Abteilung 3                       |
blabla weg 7                      |
56789 quasselstadt                |
                                  |
------------------                |
Hans Wurst                        |
Abteilung 3                       |
blabla weg 7                      |
56789 quasselstadt                |
                                  |
------------------                |
robi@linux:/home/robi/test > ./script 1 4 adressen



Jack Daniels    |Susanne Sorglos |Markus Musterman|Otto Mueller
Verköstung      |Verwaltung      |Muelltrennung   |Abteilung bla
Blaue Allee 15  |Jodel Str. 21   |Musterstrasse 77|abcstrasse 1
29640 Schneverdi|29640 Schneverdi|29614 Soltau    |12345 stadt
                |                |                |
----------------|----------------|----------------|----------------
Hans Wurst      |                |                |
Abteilung 3     |                |                |
blabla weg 7    |                |                |
56789 quasselsta|                |                |
                |                |                |
----------------|                |                |
robi
 
*nicht ernst gemeint* Ich sehe Optimierungspotential "Leeretiketten"


Ich würde das ganze eher so probieren:
Code:
- "Adressen als Einzeiler"
spalte=x
anzahl=y
drucken=0
( cat adressen ; "cat y-1 leeradressen" ) | 
while read einzeladresse
do
    let anzahlgedruckt=anzahl
    while [ $anzahlgedruckt -gt 0 ]
    do
          echo $einzeladresse
          let  anzahlgedruckt-=1
   done
done |
while read druckadresse
do
    feld[drucken]=druckadresse
    if [ $drucken -eq $spalte ]
    then
          drucken(feld[....]...)
          let drucken=0 
   else
          let drucken+=1
    fi
done
 
Oben