Bash Script zum Convert einer Textdatei

dfritz

Grünschnabel
*** Update ***

Hallo zusammen,

vielleicht könnte ihr mir weiterhelfen.

Ich bekomme von meinem Lieferanten eine TXT Datei mit Leerzeichen als Feldtrenner. Ich möchte nun gerne anstatt der Leerzeichen, die die Felder trennen ein ";" einsetzen um die Felder zu trennen.

Mit AWK habe ich schon Felder ausgelesen, allerdings wenn Felder auftauchen die mehr als einen Wert haben (Artikelbeschreibung) kann ich dies nicht mehr anwenden, da die Feldermenge ja unterschiedlich ist.

Hier ein Beispiel für eine Zeile :

126591 Equip ADA0000011 Kab SCSI Adapter SCA 80 Pin/68 Pin & Strom / UW equip Kabel+Adapter Cable+Adapter Adapter SCSI Adapter SCSI 200 2 0 0 7,96 0

Schwierig wird es für mich ab Kab SCSI, da bis UW es eigentlich ein Feld ist. Leider ist die Anzahl der Wörter immer unterschiedlich, so das ich nicht einfach die Felder in einer Variable zusammenführen kann.

Im Endeffekt möchte ich wie hier :

herstellerart=`echo $LINE |awk '{print $1}'`

die Felder in Variabelen setzen um Sie dann zu verarbeiten.

Vielleicht hat jemand einen Tipp, wie ich das lösen könnte.

Danke

Gruß Daniel
 
Zuletzt bearbeitet:
Hallo, ich habe die Situation oben nochmal genauer beschrieben. Vielleicht nun jemand einen Tipp.

Danke

Daniel
 
Hi.

Wie hast du dir das denn vorgestellt? Also wenn du nicht weißt wie die Zeilen aussehen bzw. nur das jedes Leerzeichen der Beginn eines neuen Feldes sein könnte, dann nützt dir das nicht viel. Du müßtest schonmal definieren wie eine Zeile aussieht bzw. was für Zeilen vorkommen und wie diese Zeilen dann aufgebaut sind.

Gruß
 
Hallo zusammen,

also es handelt sich bei den Feldtrenner um TABs

Mittels "cat preisliste.txt |cut -d"Strg-v-i" -f1" kann ich nun auch die Felder auslesen und bekomme auch die richtigen Werte.

Ich möchte das ganze aber gerne aus einem Bashscript starten.

#!/bin/bash

preisliste=test.txt
echo $LINE

cat $preisliste > /dev/nul
# cd /ag/bcom
while read LINE;
do

herstellerart=`echo $LINE|cut -d " " -f1`
echo "herstellerart >" $herstellerart

done < /ag/bcom/$preisliste


Doch leider kriege ich dann nicht die gleichen Werte wie in der Konsole, sondern die Zeile wird komplett ausgegeben ? Gibt es hierfür einen Grund oder kann mir jemand einem Tipp geben, warum sich das Script anders verhält als die Konsole ?

Gruß Daniel
 
Hi.
Hallo zusammen,

also es handelt sich bei den Feldtrenner um TABs

Mittels "cat preisliste.txt |cut -d"Strg-v-i" -f1" kann ich nun auch die Felder auslesen und bekomme auch die richtigen Werte.

Ich möchte das ganze aber gerne aus einem Bashscript starten.

#!/bin/bash

preisliste=test.txt
echo $LINE

cat $preisliste > /dev/nul
# cd /ag/bcom
while read LINE;
do

herstellerart=`echo $LINE|cut -d " " -f1`
echo "herstellerart >" $herstellerart

done < /ag/bcom/$preisliste


Doch leider kriege ich dann nicht die gleichen Werte wie in der Konsole, sondern die Zeile wird komplett ausgegeben ? Gibt es hierfür einen Grund oder kann mir jemand einem Tipp geben, warum sich das Script anders verhält als die Konsole ?
Ja, dafür gibt es einen Grund.

Wenn du "echo $LINE" aufrufst, expandiert die Shell erstmal die Variable. Dadurch entstehen mehrere getrennte Worte (soweit es die Shell betrifft) und die werden dann auch einzeln an das Kommando echo übergeben. echo gibt diese Worte einzeln, durch Leerzeichen getrennt voneinander aus. D.h. die Tabs die da drin waren sind natürlich weg. Du mußt die Variable in Anführungszeichen setzen um das zu verhindern. Allerdings mußt du nicht unbedingt Tab als Trennzeichen angeben, Tab ist das Standardtrennzeichen von cut. Wenn du es angeben willst, machs lieber so:
Bash:
herstellerart=`echo "$LINE" |cut -d $'\t' -f1`

Du müßtest aber nichtmal externe Programme verwenden, das kann Bash ja alles noch selbst:
Bash:
function readPriceList() {
  local IFS=$'\t\n'

  while read -a line; do 
    echo "hersteller: ${line[0]}"
  done < "$preisdatei"
}

Gruß

PS: Bitte verwende doch die entsprechenden Code-Tags für deinen Quellcode den du hier postest. ([bash]...[/bash] für Bash Code, [c]...[/c] für C Code usw.)
 

Neue Beiträge

Zurück