# Bash Script zum Convert einer Textdatei



## dfritz (13. Juni 2007)

*** 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


----------



## dfritz (14. Juni 2007)

Hallo, ich habe die Situation oben nochmal genauer beschrieben. Vielleicht nun jemand einen Tipp.

Danke 

Daniel


----------



## deepthroat (14. Juni 2007)

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ß


----------



## dfritz (18. Juni 2007)

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


----------



## deepthroat (18. Juni 2007)

Hi.





dfritz hat gesagt.:


> Hallo zusammen,
> 
> also es handelt sich bei den Feldtrenner um TABs
> 
> ...


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:

```
herstellerart=`echo "$LINE" |cut -d $'\t' -f1`
```

Du müßtest aber nichtmal externe Programme verwenden, das kann Bash ja alles noch selbst:
	
	
	



```
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.)


----------

