Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Möglichst viele Informationen aus einer Zeile extrahieren?



oafish
17-07-2008, 15:56
Hallo zusammen,
ich möchte mit der Bash aus einer Textdatei immer die erste Zeile auslesen und dabei, die Werte ändern.

Der aufbau der Datei sieht so aus:
Spalte1:Spalte2:Spalte3:Spalte4:Spalte5:Spalte6

Die Datei lese ich mit

sed -n '1p' $DATEI
ein.
Das funktioniert soweit. Nun könnte ich die ausgabe in eine Variable lenken und mit cut den Delimiter auf ":" setzen. Das müßte ich aber für Spalte3 und für Spalte4 tun was eigentlich unschön ist. Was ich auch noch tun müsste, wäre die Spalte3 zu ändern indem ich diese etwas erweitere. Also wenn Spalte3 den Inhalt "Hase" hat, soll am Ende ein "Angst" hinzugefügt werden. Ergibt dann für Spalte3 "HaseAngst".
Hat jemand eine möglichst elegante Lösung ohne viel Bash Kommandos zu verwenden?

jan61
17-07-2008, 19:05
Moin,


sed -nr '1s/([^:]+:[^:]+:)([^:]+)(.*)/\1\2Hase\3/;p' Dateioder

awk -F':' ' NR == 1 { $3 = $3 "Hase" }
{ OFS = ":"; print } ' Datei

Wenn Du ausschließlich die 1. Zeile ausgeben willst:

sed -nr '1s/([^:]+:[^:]+:)([^:]+)(.*)/\1\2Hase\3/p' Dateioder

awk -F':' ' NR == 1 { $3 = $3 "Hase"; OFS = ":"; print } ' Datei

Jan

oafish
18-07-2008, 17:30
Hallo Jan,
danke für die vielen Möglichkeiten. Wenn ich es aber richtig interpretiere, extrahiere ich aber nicht die Spalten in Variablen, oder? Kann man diese auch gleich in $1 = Spalte1, $2 = Spalte2 etc. umlenken? Das wäre extemst "cool" :D

Viele Grüße

jan61
18-07-2008, 20:32
Moin,

da habe ich Dich ein wenig missverstanden, ich dachte, es geht Dir um die Spaltenänderung.

Und ja, innerhalb des awk hast Du die Spalten in eigenen Variablen - fein säuberlich von $1 ... $NF. Überlege Dir, ob Du Deine Aufgabe innerhalb des awk-Scripts erledigen kannst.

Ansonsten geht es z. B. mit Arrays recht elegant:

jan@jack:~/tmp/csv> cat vars.sh
#! /bin/bash
declare -a flds
ln1="`sed -n '1s/:/ /gp' Datei`"
flds=($ln1)
for (( i = 0; i < ${#flds
}; i++ )); do
test $i -eq 2 && flds[$i]=${flds[$i]}Hase
echo "Spalte" $(($i+1)) "=" ${flds[$i]}
done
jan@jack:~/tmp/csv> ./vars.sh
Spalte 1 = Spalte1
Spalte 2 = Spalte2
Spalte 3 = Spalte3Hase
Spalte 4 = Spalte4
Spalte 5 = Spalte5
Spalte 6 = Spalte6
Jan