ubuntuusers.de

Skript um den Dateiinhalt zu vervollständigen

Status: Ungelöst | Ubuntu-Version: Ubuntu 18.04 (Bionic Beaver)
Antworten |

furkan42

Anmeldungsdatum:
22. April 2018

Beiträge: 15

Hey leute

nehmen wir an ich habe eine Datei mit dem namen hallo.txt und in dieser datei ist folgendes enthalten:

3
hallo
hallo
hallo

könnte ich jetzt für diese Datei hallo.txt einen skript erstellen, was 10 mal untereinander hallo ausgibt für die datei hallo.txt und dabei jedesmal die zahl um 1 erhöht in der ersten Zeile wenn ein weiteres hallo eingefügt wird, desweiteren soll das skript sich immer wieder vervollständigen wenn ein hallo von mir entfernt wird dafür bräuchte man denke ich eine forschleife.

Bearbeitet von rklm:

Codeblock. Bitte beachte Forum/Syntax!

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4687

Wohnort: Berlin

@furkan42: Also die Aufgabenstellung ist IMHO nicht präzise genug beschrieben.

Und man kann in einer allgemein Textdatei keine Zeilen mitten drin ändern. Denn wenn sich die Zeilenlänge ändert müssen ja alle folgenden Bytes nach hinten oder nach vorne verschoben werden. Selbst wenn es „in place“ geht, ist es normalerweise einfacher die Datei neu zu schreiben.

Falls das sicher passieren soll, schreibt man in eine temporäre Datei und benennt die am Ende zur Originaldatei um. Und falls die Datenmengen grösser werden, wird das mit so einer Textdatei ineffizient und man löst das anders.

furkan42

(Themenstarter)

Anmeldungsdatum:
22. April 2018

Beiträge: 15

Marc_BlackJack_Rintsch schrieb:

@furkan42: Also die Aufgabenstellung ist IMHO nicht präzise genug beschrieben.

Und man kann in einer allgemein Textdatei keine Zeilen mitten drin ändern. Denn wenn sich die Zeilenlänge ändert müssen ja alle folgenden Bytes nach hinten oder nach vorne verschoben werden. Selbst wenn es „in place“ geht, ist es normalerweise einfacher die Datei neu zu schreiben.

Falls das sicher passieren soll, schreibt man in eine temporäre Datei und benennt die am Ende zur Originaldatei um. Und falls die Datenmengen grösser werden, wird das mit so einer Textdatei ineffizient und man löst das anders.

kann sein das ich es bisschen schwierig formuliert habe die datei soll halt in der letzen zeile ein hallo einfügen dabei soll die zahl in der ersten Zeile immer um +1 ergänzen

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13205

Das sieht mir sehr nach einer Hausaufgabe aus. Natürlich können wir Lösungen präsentieren, aber das hilft Dir nicht.

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4687

Wohnort: Berlin

@furkan42: Soll die Zahl in der ersten Zeile um eins erhöht werden, oder soll die immer die Anzahl der „hallo“-Zeilen wiedergeben, oder soll die Anzahl der „hallo“-Zeilen am Ende immer in der ersten Zeile stehen? Das sind letztlich drei verschiedene Anforderungen.

Was hast Du denn schon und woran konkret hakt es denn?

furkan42

(Themenstarter)

Anmeldungsdatum:
22. April 2018

Beiträge: 15

Marc_BlackJack_Rintsch schrieb:

@furkan42: Soll die Zahl in der ersten Zeile um eins erhöht werden, oder soll die immer die Anzahl der „hallo“-Zeilen wiedergeben, oder soll die Anzahl der „hallo“-Zeilen am Ende immer in der ersten Zeile stehen? Das sind letztlich drei verschiedene Anforderungen.

Was hast Du denn schon und woran konkret hakt es denn?

jedesmal wenn ein hallo in der letzen zeile eingefügt wird vom skript soll es um +1 steigen

also die erste variante was du geschildert hast würde ich gerne wissen, jedoch wäre ich auch offen die anderen Varianten kennenzulernen, da dies auch passend wäre dazu

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4687

Wohnort: Berlin

@furkan42: Also die erste Variante sähe in GW-BASIC (war bei MS DOS bis MS DOS 4 dabei und mein erstes Basic auf dem PC) so aus:

1
2
3
4
5
10 F$="hallo":FIN$=F$+".txt":FOUT$=F$+".$$$"
20 OPEN FIN$ FOR INPUT AS #1:OPEN FOUT$ FOR OUTPUT AS #2
30 LINE INPUT #1,N$:PRINT #2,VAL(N$)+1
40 WHILE NOT EOF(1):LINE INPUT #1,N$:PRINT #2,N$:WEND
50 PRINT #2,"hallo":CLOSE 1:CLOSE 2:KILL FIN$:NAME FOUT$ AS FIN$

furkan42

(Themenstarter)

Anmeldungsdatum:
22. April 2018

Beiträge: 15

furkan42 schrieb:

Marc_BlackJack_Rintsch schrieb:

@furkan42: Soll die Zahl in der ersten Zeile um eins erhöht werden, oder soll die immer die Anzahl der „hallo“-Zeilen wiedergeben, oder soll die Anzahl der „hallo“-Zeilen am Ende immer in der ersten Zeile stehen? Das sind letztlich drei verschiedene Anforderungen.

Was hast Du denn schon und woran konkret hakt es denn?

jedesmal wenn ein hallo in der letzen zeile eingefügt wird vom skript soll es um +1 steigen

also die erste variante was du geschildert hast würde ich gerne wissen, jedoch wäre ich auch offen die anderen Varianten kennenzulernen, da dies auch passend wäre dazu

ich glaube ich habe mich was das angeht vertan weil sowie ich das geschildert habe wäre das vielzuschwierig man müsste alles einzeln nochmal abchecken lassen aber wenn wir die zahl oben also die gesamte hallo anzahl anhand der Zahl checken lassen ist dies einfacher, denn wir wollen ja nicht mehr als 10 hallo zeilen haben und die hallo Zeilen sollen anhand der Zahl ablesbar sein wir fangen ja auch schlieslich bei 4 an weils 4 hallos gibt

ich denke mal ich sollte mit typeset sed while do done und if arbeiten

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4687

Wohnort: Berlin

@furkan42: Also die drei Varianten sind alle nicht wirklich schwierig. Variante 1 habe ich in dem GW-BASIC-Programm ja implementiert. Allerdings ohne irgendwelche Prüfungen. Das ist ja im Grunde das was die 3 Varianten unterscheidet: Was passiert wenn die die Zahl in der ersten Zeile nicht mit der Anzahl der Hallo-Zeilen übereinstimmt. Falls die Zahl mit der Anzahl der Hallo-Zeilen übereinstimmt, liefern alle drei Varianten das gleiche Ergebnis, da wäre es also egal welche man wählt. Varianten 1 und 2 kommen ohne das komplette einlesen der Datei in den Speicher aus. Das müsste man bei Variante 3 tun, oder die Datei zwei mal lesen.

Was soll denn passieren wenn

  • die Zahl in der ersten Zeile nicht mit der Anzahl der Hallo-Zeilen übereinstimmt?

  • die Datei leer ist?

  • in der ersten Zeile keine Zahl steht?

  • nicht in jeder Zeile „hallo“ steht?

Wobei mich jetzt die Zahl 10 stutzig macht. Die hast Du im ersten Beitrag schon mal erwähnt, aber da machte die IMHO keinen Sinn. Was hat es denn damit auf sich? Kommt also zu der Liste noch hinzu:

  • in der ersten Zeile eine 10 steht?

  • in der ersten Zeile eine Zahl >10 steht?

  • in der ersten Zeile eine Zahl <0 steht?

Das Programm soll doch die Datei pro Aufruf um ein Hallo erweitern‽ Denn sonst macht die Ausgangsdatei keinen Sinn und man könnte einfach eine Datei mit einer 10 in der ersten Zeile und dann 10 Zeilen Hallo schreiben. Dann sähe das Programm einfach so aus:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#!/bin/bash
echo '10
Hallo
Hallo
Hallo
Hallo
Hallo
Hallo
Hallo
Hallo
Hallo
Hallo' >hallo.txt

typeset würde ich nicht mehr verwenden, das ist laut Bash-Hilfe „obsolete“ und es wird auf declare verwiesen.

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4687

Wohnort: Berlin

Variante 2 in Tcl und mit der Einschränkung das nur etwas gemacht wird, wenn in der ersten Zeile eine ganz Zahl von 0 bis 9 steht:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#!/bin/sh
# \
exec tclsh "$0" "$@"

set filename hallo.txt

set chan [open $filename r]
gets $chan count
close $chan

if {[string is integer -strict $count] && $count >= 0 && $count < 10} {
    incr count
    set chan [open $filename w]
    puts $chan $count
    puts -nonewline $chan [string repeat "hallo\n" $count]
    close $chan
}
Antworten |