PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : sed(?) vorkommen zählen



ralisi
29-04-2006, 13:49
Ich bin garde dabei n bash-skript zu schreiben. Der ist der aktuelle Stand ist, dass ausgegeben wird:


, , ,
,
, ,

(oder mehr/weniger zeilen, oder mehr/weniger "," pro Zeile)

wie mache ich am besten daraus: ?


0 1 2
3
4 5

musketaquid
29-04-2006, 15:41
Nichts für ungut, aber was soll das heißen?

Der ist der aktuelle Stand ist, dass ausgegeben wird:

Wenn ich die Kommatas zählen will, würde ich das so machen:

count=0

for i in $(cat /file_mit_kommatas) ; do
count=$((++count))
done

ralisi
29-04-2006, 17:13
ich will aber nicht die kommatas zählen, ich will jedes komma mit einer Zahl ersetzen. es soll also das 1. Komma mit 0 ersetzt werden, das 2. mit 1, das 3. mit 2 usw. dabei soll auch die Struktur der Zeilenumbrüche erhlten bleiben.

Die Ausgabe soll also so aussehen, wie in meiner Frage unten gezeigt.
Ich habe leider auch keine Idee, wie man diese Funktion benennen könnte, um nach ihr zu googlen.

klaus_harrer
29-04-2006, 17:44
Hallo

Man könnte es so machen das du einen counter erzeugst den Text in eine Variable kopieren. Mit grep die komma's zählst auch in einer Variable speichern und das ganze in eine for Schleife stecken.

for ((i=0;i<kommas;i++))
do
echo -e "$text" | sed "s/,/$count/"
done

MfG
klaus_harrer

ralisi
29-04-2006, 21:14
ich habe es geschafft.


skript:


#!/bin/bash
lines=$(cat input | wc -l)
zeile=1
wert=0
for ((d=0;d<lines;d++))
do

text=$(cat input | sed -n "$(echo $zeile)p")
zeile=$((++zeile))
count=0

for i in $text
do
count=$((++count))
done
tt=$text
for ((i=0;i<count;i++))
do
stelle=1

tt=$(echo -e "$tt" | sed "s/,/$wert/$stelle")
stelle=$((++stelle))
wert=$((++wert))
done


echo $tt >> output
done



und die input und output sind so wie im ausgangspst geschrieben.

musketaquid
30-04-2006, 16:41
Die Variablen zeile und stelle kannst du weglassen und stattdessen das schreiben

text=$(cat input | sed -n "$(echo $((d + 1)))p")
...
tt=$(echo -e "$tt" | sed "s/,/$wert/$((i + 1))")

So hast du immerhin 4 Zeilen Code gespart ;)