Linux 15.026 Themen, 107.016 Beiträge

Bash Hilfe bei Skripterstellung bzgl. CSV Verarbeitung

CGWS / 11 Antworten / Baumansicht Nickles

Hallo zusammen,

ich arbeite gerade an einem Bash Skript, dass eine CSV Datei verarbeitet die folgendermaßen aufgebaut ist:

servername,beliebigeZeichen-beliebigeZeichen-1.0.0.jar,34384327469324634servername,beliebigeZeichen-beliebigeZeichen-1.0.1.jar,70740238748932740
servername,beliebigeZeichen_beliebigeZeichen_1.0.2.jar,70740238748932740

Das Skript soll später folgende Ausgabe erzeugen:

  • beliebigeZeichen-beliebigeZeichen (1.0.0, 1.0.1, 1.0.2)

Ich habe aktuell eine temporäre Variable, die mir das mittlere Feld im aktuellen Schleifendurchlauf gespeichert hat. Hat jemand eine Idee wie man die gewünschte Ausgabe erzeugen könnte?

Gruß
CGWS

bei Antwort benachrichtigen
Borlander CGWS „Bash Hilfe bei Skripterstellung bzgl. CSV Verarbeitung“
Optionen

Also irgendwie kann ich die Struktur der CSV-Datei nicht so wirklich eindeutig erkennen. Da wird es natürlich schwierig mit irgendwelchen Tipps ;-)

bei Antwort benachrichtigen
CGWS Borlander „Also irgendwie kann ich die Struktur der CSV-Datei nicht so ...“
Optionen

Hallo Borlander,

was benötigst du denn um mir helfen zu können :-)?

Gruß
CGWS

bei Antwort benachrichtigen
Borlander CGWS „Hallo Borlander, was benötigst du denn um mir helfen zu ...“
Optionen

Ich vermute z.B., dass dabeim Posten oder der Anzeige einige zusätzliche Zeilenumbrüche mit enstaden sein könnten. Ist das Beispiel alles eine Zeile? Oder drei Zeilen? Wie viele Spalten hat die CSV-Datei überhaupt?

bei Antwort benachrichtigen
CGWS Borlander „Ich vermute z.B., dass dabeim Posten oder der Anzeige einige ...“
Optionen

Hallo Borlander!

Folgendes ist immer eine Zeile (also immer 3 "Spalten"):

  • servername,beliebigeZeichen-beliebigeZeichen-1.0.0.jar,34384327469324634

Gruß

bei Antwort benachrichtigen
Borlander CGWS „Hallo Borlander! Folgendes ist immer eine Zeile also immer 3 ...“
Optionen

Dann würde ich das ganze zunächst erst einmal mit

cut -d , -f 2 test.csv | sort

vorbehandeln. Damit wären dann schon mal alle Einträge mit beliebigeZeichen-beliebigeZeichen gruppiert und nach Versionsnummer sortiert. Das Zusammenfassen der Versionsnummern könnte mit awk möglich sein: Das Präfix jeweils merken, und lange es nicht vom letzten abweicht die Versionsnummern sammeln und bei Veränderung schließlich die komplette Zeile ausgeben, sowie ergänzend dazu auch noch mal am Ende.

Oder ist beliebigeZeichen-beliebigeZeichen immer identisch für alle Zeilen der Datei?

bei Antwort benachrichtigen
CGWS Borlander „Dann würde ich das ganze zunächst erst einmal mit cut -d , ...“
Optionen

Hallo Borlander,

vielen Dank für deine Antwort. Ich hatte bis jetzt noch keine Zeit gehabt an diesem Problem weiter zu arbeiten. Padon.

Ich habe mir noch einmal aktuell den Inhalt der Datei etwas genauer angeschaut. Ich glaube es reicht leider mit diesem einfach Befehl nicht aus. Es gibt bspw. Zeilen die folgendermaßen aufgebaut sind:

  • 2.beliebigeZeichen-v.1.0.jar
  • xy-xyz-xyz-1.0.15-BI-2001-RC1.jar
  • xy-xyz-xyz-1.0.15-Thunder--RC1.jar
  • sorter_100283.jar
  • sorter.jar
  • sorter-qwewe_5373638.jar
  • sync-1.5-SNAPSHOT.ear
  • erz-so-5.1.jar
  • tzb-sa-1.5.16-BI4352-SNAPSHOT.jar
  • clone-dbi-sm-2.13.0-TK23232-RC07.jar

Generell sind es oft aber auch beliebige Zeichen und es könne auch Unterstriche zur Trennung verwendet werden.

Kannst du mir vielleicht noch weiterhelfen? Vielen Dank schon einmal!

GrußCGWS

bei Antwort benachrichtigen
Borlander CGWS „Hallo Borlander, vielen Dank für deine Antwort. Ich hatte ...“
Optionen

Das wird schwierig, zumal es noch Beispiele gibt ganz ohne Versionsnummer. Was willst Du mit denen machen, bzw. wie willst Du die in der Ausgabe darstellen?

Grundsätzlich könntest Du versuchen per RegEx alles ab Ziffern.Ziffern bzw. mehrere Ziffern bis vor .jar zu erfassen. Selbst da wäre ich mir dann aber nicht so sicher ob damit alle Versionsnummer gematcht werden.

Möglicherweise könnte man das ganze mit Look-around_assertions aufsplitten, aber da müsstest Du sicher schon ein bisschen basteln.

Einfacher könnte es sein eine RegEx zu formulieren die immer die komplette Zeile matcht und sich die zwei Teil-Matchings (Bezeichner und Versionsstring) zu extrahieren. Wirklich einfach wird es da aber auch nicht einen Ausdruck zu formulieren der immer funktioniert ;-)

bei Antwort benachrichtigen
CGWS Borlander „Das wird schwierig, zumal es noch Beispiele gibt ganz ohne ...“
Optionen

Hallo Borlander,

vielen Dank für deine Antwort. Kennst du dich denn gut mit regulären Ausdrücken aus?

Ich selber bin da leider kein Experte und könnte da gut Hilfe gebrauchen :-). Wenn ein Großteil der meisten Zahlen schon funktioniert ist das schon einmal gut ;-).

Gruß
CGWS

bei Antwort benachrichtigen
Borlander CGWS „Hallo Borlander, vielen Dank für deine Antwort. Kennst du ...“
Optionen
Kennst du dich denn gut mit regulären Ausdrücken aus?

Hat bislang immer gereicht. Der absolute Experte bin ich allerdings nicht. Ich würde erst mal was in der Richtung probieren:

^(.+)[_-](((v.)?\d\.\d(\.\d)?|\d{3,}).*)\.jar$

Dann ist da erste Sub-Matching der Bezeichner und das zweite der Versionsstring.

Ob sich das noch (sinnvoll) mit einem Bash-Script lösen lässt bezweifle ich ein wenig. Das dürfte mir einer Script Sprache wie z.B. Ruby, Phython oder was Dir sonst so gefällt im Zweifelsfall einfacher zu realisieren sein.

sorter.jar
sorter-qwewe_5373638.jar

Gehört da qwewe eigentlich noch mit zur Version?

bei Antwort benachrichtigen
CGWS Borlander „Hat bislang immer gereicht. Der absolute Experte bin ich ...“
Optionen

Hallo Borlander,

vielen Dank für deine Antwort. qwewe gehört hier nicht zu der Versionsangabe.

Zu deinem regulären Ausdrück. Dieser funktioniert jetzt aber nur für jar Endungen, wenn ich ihn teste, oder?

GrußCGWS

bei Antwort benachrichtigen
Borlander CGWS „Hallo Borlander, vielen Dank für deine Antwort. qwewe ...“
Optionen
qwewe gehört hier nicht zu der Versionsangabe.

Dann sollte es passen mit Versionsnummern die sich aus zwei oder drei durch Punkt getrennten Zifferngruppen sowie einem optionalen v. als Präfix zusammensetzen.

Dieser funktioniert jetzt aber nur für jar Endungen, wenn ich ihn teste, oder?

In der obigen Form ja. Man könnte das aber auch für beliebige Endungen anpassen und stattdessen einfach eine belibiege Anzahl von Zeichen die kein Punkt sind matcht mit [^\.]+ statt jar.

GrußBorlander

bei Antwort benachrichtigen