"cut" vertikal ausführen bzw. vertikal auswerten

B

Blackcollar

Grünschnabel
Moin Leute,

mit cut kann ich ja folgendes machen :
Code:
Dateiinhalt : asd | qwe | lew | qwe

Mit dem Befehl cut -d"|" -f 1 gibt er mir dann ja asd aus. soweit alles klar.
Nun habe ich aber eine Datei in der die Werte vertikal sind:

Code:
####
test lol
mope asd
rofl ass
####
test lol2
mope asd2
rofl ass2
####
test lol3
mope asd3
rofl ass3

Nun brauche ich einen Befehl der ### als delimiter angibt und dann den Text drunter ausgibt. Dummerweise sind es nicht immer 3 Zeilen sonst würde ich mir aus tail und head etwas bauen.

Weiß hier jemand rat ?

gruß
'collar
.
.
.
EDIT (autom. Beitragszusammenführung) :
.

Unter der Annahme dass nach dem letzten Eintrag nix mehr kommt funktioniert mein kleines zusammengebasteltes Script so ...
lieber wäre es mir aber wenn es einen Befehl dazu gibt.
von daher wer Ideen hat, als her damit ;)

gruß
'collar

Code:
file="menu.lst"
grep="title"

#
q=0
for i in `grep -n $grep $file | cut -d":" -f 1`
do
        if [ $q != 0 ]
        then
                cat $file | head -n $(( i - 1 )) | tail -n $(( i - q  ))
                echo ""
        fi
        q=$i
done
x=`wc $file -l | cut -d" " -f1`
cat $file | head -n $x | tail -n $(( x - q + 1 ))
 
Zuletzt bearbeitet:
Ich verstehe nicht so richtig, was Du bezwecken willst. Welches Ergebnis soll rauskommen?
 
Hallo!

Ich nehme an, du willst z.B den 2.Textblock auslesen, oder?
Einfache Befehle gibt's für sowas, so weit ich weiß, nicht.
Wenn man noch so wie ich noch mit ksh88 auskommen muß (seufz), dann scheint mir das das einfachste zu sein:
Code:
> export I=0;cat 2.txt|while read LN;do
> [[ $LN = "####" ]] && I=$(($I+1)) || MYARRAY[I]="${MYARRAY[I]}$LN\n"
> done
> echo ${MYARRAY[2]}
test lol2
mope asd2
rofl ass2

ein Nachteil: The value of all subscripts must be in the range of 0 through 1023. - also mehr als 1024 Textblöcke dürfte ich nicht befüllen wollen ...
 
Zuletzt bearbeitet:
Wenn neutrino1 das Problem richtig verstanden hat, will ich hier meine Lösung nachreichen:

Code:
perl -ne 'BEGIN{$i=0} $i++ if s/^#.*//s; print if $i==2' menu.lst

edit: Für eine Benutzung dieses Befehles in einem Shellskript geht

Code:
idx=2
perl -ne "BEGIN{\$i=0} \$i++ if s/^#.*//s; print if \$i==$idx" menu.lst
 
Zuletzt bearbeitet:
Sorry for off-topic, but @Xanti: Könntest du mal dein Nutzen von BEGIN in diesem Zusammenhang erklären? Wäre ganz nett, danke. :)
 
Sorry for off-topic, but @Xanti: Könntest du mal dein Nutzen von BEGIN in diesem Zusammenhang erklären? Wäre ganz nett, danke. :)

Wie BEGIN definiert ist, brauch ich Dir wahrscheinlich nicht erklären, da ich weiß, dass Du gute Quellen hast. ;)

Die Option -n (auch -p) legen eine Schleife um das File menu.lst. Will heißen, dass Perl jede Zeile von menu.lst nimmt und darauf den in -e '...' definierten Code anwendet. Die Zeile steckt in $_, so wie in

Code:
open(FILEHANDLE, "<menu.lst")
foreach(<FILEHANDLE>) {...}

Damit $i unabhängig von diesem Code ist, also nicht bei jedem Aufruf initialisiert wird, muss $i ausserhalb initialisiert werden. Und dies geht mit BEGIN Block, INIT Block geht auch, weil dieser Block direkt nach der Kompilierung einmal ausgeführt wird.
 
Ah, danke. Das Flag -n war dann das, was ich nicht richtig (bzw. gar nicht ;)) gedeutet habe.
 
Hallo
Geht auch mit sed:

$ cat dummy
####
testt lol
mope asd
rofl ass
####
test lol2
mope asd2
rofl ass2
####
test lol3
mope asd3
rofl ass3
wolle@Nietzsche:~/temp
$ sed -ne '/####/{N;N;s/^[^\n]\+\n\+[^\n]\+\n\+\(.*\)\+$/\1/g;p}' dummy
mope asd
mope asd2
mope asd3

Gruß Wolfgang
 
@Wolfgang - Ähm, bei Dir kommt aber ein anderes Ergebnis raus. Wenn ich das richtig sehe, jeweils die zweite Zeile hinter jedem #####, während bei den anderen Lösungen die Einträge zwischen zweiter und dritter ##### augegeben wird. :think:

Gruß, Daniel
 
Ja, dann habe ich die Aufgabe falsch verstanden.

Gruß Wolfgang
 
Das muss nicht sein. Ich ging von neutrino1s Interpretation aus. Und auf meine Anfrage in #2 ist der Thread-Ersteller noch nicht eingegangen.
 
So wie ich das verstehe, will der Threadersteller als Ergebnis alle Zeilen ohne
den ### haben, bleibt nur die Frage ob diese (meistens 3) Zeilen dann zu einer zusammengefasst werden sollen oder nicht....

Ganz frech :D
Code:
tiger:~ schlaubi$ cat dummy 
####
test lol
mope asd
rofl ass
####
test lol2
mope asd2
rofl ass2
####
test lol3
mope asd3
rofl ass3
tiger:~ schlaubi$ grep -v "###" dummy 
test lol
mope asd
rofl ass
test lol2
mope asd2
rofl ass2
test lol3
mope asd3
rofl ass3
 

Ähnliche Themen

Sed: Bestimmtes Feld einer "Zeile mit mehreren Feldern" ergänzen

mittels if abfrage datei nach variabelnwert durchsuchen

Shellskript - Fehler in Cron

Problem mit HSPA+ Modem Huawei E353 - Installation unmöglich?

AWK Tip gesucht

Zurück
Oben