[gelöst]String-Vergleich im Bash-Script

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
alex9050
Beiträge: 17
Registriert: 03.12.2015 16:28:25

[gelöst]String-Vergleich im Bash-Script

Beitrag von alex9050 » 14.12.2015 16:43:01

Hallo,
hat jemand einen Lösungsansatz für folgendes Problem?:
In einem Verzeichnis befinden sich eine beliebige Anzahl Dateien. Die Dateinamen folgen dem Muster

Code: Alles auswählen

3043289-ghjt-hgts-sonquatsch-undsoweiter....txt
Die Nummerierung am Anfang des Dateinamens ist aufsteigend, aber nicht durchgehend.
In einer Datei wurde der Dateiname mit der höchsten Nummer gespeichert.

Im Script sollen nun nur die Dateien berücksichtigt werden, deren Nummer größer ist als die, welche in besagter Datei gespeichert wurde.
Ich habe da etwas mit test versucht, eigentlich war mir schon klar, daß es nicht funktionieren würde, da die Option ja für Zahlen gedacht ist, aber: Versuch macht klug :roll:

Code: Alles auswählen

for artikel in "$outputdir/"*.txt ; do

	if [ "$artikel" -gt "./letzter_artikel" ]
	then echo $(basename  $artikel) >> "./newssort.tmp"
	fi

done
Ich hab's auch nur reingestellt, um das Problem zu veranschaulichen.

eigentlich wäre es ja auch nur nötig, den nummerischen Anteil zu vergleichen. Gibt es eine entsprechende Funtion wie bspw. "VAL" in Basic?
Zuletzt geändert von alex9050 am 15.12.2015 16:16:28, insgesamt 1-mal geändert.

alteholz
Beiträge: 41
Registriert: 11.04.2012 19:43:57

Re: String-Vergleich im Bash-Script

Beitrag von alteholz » 14.12.2015 16:58:25

So könnte es gehen, oder meintest Du etwas anderes:

Code: Alles auswählen

count=`ls -1|wc -l`
ls -1|sort -n|grep -A $count `cat last_file`|grep -v `cat last_file` > ./newssort.tmp
Ansonsten wäre das:

Code: Alles auswählen

declare int v; v=$((123-blubb)); echo $v
Thorsten

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: String-Vergleich im Bash-Script

Beitrag von heisenberg » 14.12.2015 17:06:03

Code: Alles auswählen

if [ "$artikel" -gt "./letzter_artikel" ]
Damit vergleichst Du den Inhalt der Variablen $artikel mit der Zeichenkette "./letzter_artikel", Schau Dir mal Kommandosubstitution der bash an. Tip: Schau in meine Signatur. :)

alex9050
Beiträge: 17
Registriert: 03.12.2015 16:28:25

Re: String-Vergleich im Bash-Script

Beitrag von alex9050 » 14.12.2015 17:19:58

heisenberg hat geschrieben:

Code: Alles auswählen

if [ "$artikel" -gt "./letzter_artikel" ]
Damit vergleichst Du den Inhalt der Variablen $artikel mit der Zeichenkette "./letzter_artikel", Schau Dir mal Kommandosubstitution der bash an. Tip: Schau in meine Signatur. :)
Fein, aber auch ohne die Anführungszeichen würd's nicht funktionieren, da sowohl Variable, als auch Datei Strings enthalten, keine Ganzzahlen.

alex9050
Beiträge: 17
Registriert: 03.12.2015 16:28:25

Re: String-Vergleich im Bash-Script

Beitrag von alex9050 » 14.12.2015 17:45:01

alteholz hat geschrieben:

Code: Alles auswählen

declare int v; v=$((123-blubb)); echo $v
Thorsten
Dein Beispiel funktioniert wunderschön, solange der String in den doppelten Klammern steht, sobald ich versuche, da eine Variable einzufügen, die den String enthält, ist v$="" :cry:
Ich hab da so einiges probiert, die Datei selbst und eine Variable, in die ich den Dateiinhalt eingelesen habe: mit doppelten Klammer, einfachen Klammer, keinen Klammern und das ganz noch gequotet: nix, nix, nix.
Ich bin offenbar vernagelt :facepalm:

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: String-Vergleich im Bash-Script

Beitrag von heisenberg » 14.12.2015 17:45:40

Die Bash ist da nicht so pingelig bzgl. Datentypen.

alex9050
Beiträge: 17
Registriert: 03.12.2015 16:28:25

Re: String-Vergleich im Bash-Script

Beitrag von alex9050 » 14.12.2015 17:55:49

heisenberg hat geschrieben:Die Bash ist da nicht so pingelig bzgl. Datentypen.
Da bin ich beruhigt :lol:

Code: Alles auswählen

./konvert_HTM_2_Text.sh: Zeile 86: [: ./texte/2851944-rumms-plumms-quark.txt: Ganzzahliger Ausdruck erwartet.
Wirklich: nix für ungut, aber wenn's so wär, hätt ich das Problem vielleicht nicht :P

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: String-Vergleich im Bash-Script

Beitrag von heisenberg » 14.12.2015 18:27:46

Ich kann Dir nur empfehlen ein Tutorial zu lesen, dann wirst Du vieles lernen.

alteholz
Beiträge: 41
Registriert: 11.04.2012 19:43:57

Re: String-Vergleich im Bash-Script

Beitrag von alteholz » 14.12.2015 19:55:03

alex9050 hat geschrieben: Dein Beispiel funktioniert wunderschön, solange der String in den doppelten Klammern steht, sobald ich versuche, da eine Variable einzufügen, die den String enthält, ist v$="" :cry:
Ich hab da so einiges probiert, die Datei selbst und eine Variable, in die ich den Dateiinhalt eingelesen habe: mit doppelten Klammer, einfachen Klammer, keinen Klammern und das ganz noch gequotet: nix, nix, nix.
Ich bin offenbar vernagelt :facepalm:

Das

Code: Alles auswählen

export d="123-blubb"; declare int v; v=$((d)); echo $v
hat nicht funktioniert?
Die Variable wäre allerdings auch $v :-).

Thorsten

alex9050
Beiträge: 17
Registriert: 03.12.2015 16:28:25

Re: String-Vergleich im Bash-Script

Beitrag von alex9050 » 15.12.2015 16:13:51

Ich danke allen für die Mühe, die Ihr Euch gemacht habt. Ich hab's mich schließlich für folgende Lösung entschieden:

Code: Alles auswählen

max_file="./letzter_artikel"

if [ -r "$max_file" ]; then
  max=$(cat "$max_file")
else
  max=0
fi

for artikel in "$outputdir/"*.txt; do
  base_name="${artikel##*/}"
  num="${base_name%%-*}"

  echo "$num" # debug

  if [ $num -gt $max ]; then
    echo "$base_name" >> "newssort.tmp"
    max=$num
  fi
done

echo "$max" >| "$max_file"
Nochmal:danke.

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: [gelöst]String-Vergleich im Bash-Script

Beitrag von heisenberg » 15.12.2015 22:43:08

Ich frage mich was in newsort.tmp drin stehen soll. Eine Liste von Dateien, die grösser sind, als das ursprüngliche Max vor der Programmausführung? Das ist nicht der Fall.

Die Sortierung von "$outputdir/*txt" ist nicht numerisch sondern eine Textsortierung. 19-blablub.txt ist hier grösser als z. B. 100-blablub.txt. Weil die zweite Stelle 9 grösser ist als die zweite Stelle 0.

Hiermit kann man ein paar Testdateien anlegen, die das verdeutlichen:

Code: Alles auswählen

 for ((x=1;$x<=20;x++));do touch $RANDOM-file.txt;done ; echo 1000000-file.txt

Code: Alles auswählen

max_file="./letzter_artikel"

[ -r "$max_file" ] && orig_max=$(cat "$max_file") || orig_max=0

max=$orig_max
for artikel in "$outputdir/"*.txt; do
  base_name="${artikel##*/}"
  num="${base_name%%-*}"

  echo "$num" # debug

  if [ $num -gt $orig_max ]; then
    echo "$base_name" >> "newssort.tmp"
  fi
  [ $num -gt $max ] && max=$num
done

# Am Ende nochmal newssort.tmp sortieren
# Sehr interessanter Befehl!
sort -t - -k +1n newssort.tmp -o newssort.tmp

echo "$max" > "$max_file"
Ist das unten ein Tippfehler? >| kenne ich jetzt noch nicht. :)

Code: Alles auswählen

echo "$max" >| "$max_file"

Antworten