freshman2017
Goto Top

Möglichkeit Datensplittung über Shell-Skript

Abend in die Runde,

habe da eine Frage, vielleicht kann mir jemand helfen. Gibt es eine Möglichkeit folgendes über ein Shell-Skript abzubilden?
-> Eingangsdatei (.txt) mit Inhalt von Zahlen getrennt durch 2 Punkte: 50000..100000 -> 50000 einzelne Zahlen
-> in einer Ausgangsdatei (.txt) sollten die Zahlen aufgetrennt sein, immer in 1000 Schritten -> 50000..50999;51000..51999;52000..52999;
Wenn die 100000 erreicht sind, sollte das Skript stoppen....Kann mir wer sagen, ob so etwas möglich ist?

Beste Grüße....

Content-Key: 444849

Url: https://administrator.de/contentid/444849

Printed on: April 16, 2024 at 21:04 o'clock

Mitglied: 139374
139374 Apr 27, 2019 updated at 09:30:44 (UTC)
Goto Top
Zitat von @freshman2017:
habe da eine Frage, vielleicht kann mir jemand helfen. Gibt es eine Möglichkeit folgendes über ein Shell-Skript abzubilden?
-> Eingangsdatei (.txt) mit Inhalt von Zahlen getrennt durch 2 Punkte: 50000..100000 -> 50000 einzelne Zahlen
-> in einer Ausgangsdatei (.txt) sollten die Zahlen aufgetrennt sein, immer in 1000 Schritten -> 50000..50999;51000..51999;52000..52999;
Wenn die 100000 erreicht sind, sollte das Skript stoppen....Kann mir wer sagen, ob so etwas möglich ist?

Grundsätzlich JA, alles was man mit Textdateien so anstellen kann, kann man auch entsprechend formatiert wieder ausgeben lassen.

back-to-topDazu aber ein paar Fragen da diese leider nicht deutlich aus der Fragestellung hervorgehen.

Gibt es eine Möglichkeit folgendes über ein Shell-Skript abzubilden?
  • Was interpretierst du als Shell-Script? Bash/CMD/Powershell/Python/Perl ... ??
-> Eingangsdatei (.txt) mit Inhalt von Zahlen getrennt durch 2 Punkte: 50000..100000 -> 50000 einzelne Zahlen
  • Wie sieht die Eingangsdatei exakt aus, laut deiner Schilderung könnte diese z.B.
so aussehen
50000..50100..50334..61004..61555..61888
aber auch so mit Zeilenumbrüchen und unterschiedlicher Anzahl an Zahlen
50000..50100
50334..61004
50634..62004..61555..61888
usw. also poste doch bitte für die Eingangsdatei ein echtes Beispiel.

> -> in einer Ausgangsdatei (.txt) sollten die Zahlen aufgetrennt sein, immer in 1000 Schritten -> 50000..50999;51000..51999;52000..52999;
  • Die Ausgangsdatei, sollen dort die Zahlen genau wie in der Eingangsdatei hinterlegt werden und nur mit Semikolon getrennt? Oder nur den niedrigsten und den höchsten Wert der jeweilgen tausender Serie mit ".." getrennt voneinander und diese dann per Semikolon getrennt? Denn in deinem Beispiel sieht das so aus, kann mich natürlich täuschen.

Also wenn ich mein Beispiel von oben nehme in der Ausgangsdatei so:
50000..50100..50334;61004..61555..61888
oder eben mit min max Werten:
50000..50334;61004..61888
? Also wäre es schön wenn du das auch klar stellen könntest. Danke.


Auf gut Glück so wie ich das interpretiert habe, kippe ich dir hier mal ein Bash-Einzeiler dafür hin:
#!/bin/bash
for x in $(grep -Po '\d+' /path/testdatei.txt | sort -n) ;do current=$(($x/1000)); if [[ -z "$last" ]];then last=$current;fi;if [[ $last -eq $current ]];then echo -n "..$x";else echo -n ";$x" ;fi; last="$current" ;done | cut -d. -f3-  

Ciao.
Member: freshman2017
freshman2017 May 26, 2019 at 18:08:41 (UTC)
Goto Top
Guten Abend,

Ich habe eine Ausgangsdatei (.txt) mit folgendem Inhalt:

50000..100000


Ich möchte gerne dass im ersten Schritt die .txt wie folgt aufgebaut ist, sodass alle 1500er Schritte die Zahlen aufgesplittet werden:

50000..51499;51500..52999;53000..54499;...

Ich würde allerdings gerne, dass hier das ganze via Batch bearbeitet wird face-smile
Member: rubberman
rubberman May 26, 2019 at 21:38:41 (UTC)
Goto Top
Probier's so:
@echo off &setlocal EnableDelayedExpansion
set "infile=test.txt"  
set "outfile=test2.txt"  
set "step=1500"  

for /f "usebackq tokens=1,2 delims=." %%i in ("%infile%") do set /a "begin=%%i, end=%%j"  
set "s=%begin%.."  
set /a "begin+=step, n=begin"  

for /l %%i in (%begin% %step% %end%) do (
  set /a "n=%%i-1"  
  set "s=!s!!n!;%%i.."  
  set /a "n=%%i"  
)

if %n%==%end% (set "s=%s:~,-2%") else set "s=%s%%end%"  

>"%outfile%" echo %s%  
Steffen
Member: freshman2017
freshman2017 May 27, 2019 at 05:56:15 (UTC)
Goto Top
Steffen, vielen Dank, das klappt.
Eine Frage / Anmerkung hätte ich zum Quelltext noch bei der ich noch „kämpfe“;

@echo off &setlocal EnableDelayedExpansion
set "infile=test.txt"  
set "outfile=test2.txt"  
set "step=1500"  

for /f "usebackq tokens=1,2 delims=." %%i in ("%infile%") do set /a "begin=%%i, end=%%j"  
set "s=%begin%.."  
set /a "begin+=step, n=begin"  

for /l %%i in (%begin% %step% %end%) do (
  set /a "n=%%i-1"  
  set "s=!s!!n!;%%i.."  
  set /a "n=%%i"  
)

if %n%==%end% (set "s=%s:~,-2%") else set "s=%s%%end%"  

>"%outfile%" echo %s%  

Wie kann im Outfile noch vor die „Spliitung“ (50000..51499) einen festen Wert setzen und hinter der „Splitting“ die Menge der Splittung hinterlegen?

infile:

50000..51999

outfile:

TEXT;50000..51499;1500;TEXT;51500..51999;500;
Member: rubberman
rubberman May 27, 2019 at 11:14:15 (UTC)
Goto Top
Zeile 7 ändern:
set "s=TEXT;%begin%.."

Zeile 17 hinzu:
set "s=%s%;500;"
... wobei ich keine Ahnung habe was du mit "Menge der Splittung" meinst und ob das nun ein fixer Wert ist oder nicht.

Steffen
Member: freshman2017
freshman2017 May 27, 2019 at 12:29:12 (UTC)
Goto Top
Bei der Menge meine ich die Anzahl/Differenz Bspw. bei einer Ausgabe 50000..50999 wäre es 1000. Würde das gehen?
Member: rubberman
rubberman May 27, 2019 at 16:22:35 (UTC)
Goto Top
Also das was oben as Variable step definiert wurde?
Dann ändere die 500 zu %step% und fertig.

Steffen
Member: freshman2017
freshman2017 May 27, 2019 at 16:31:40 (UTC)
Goto Top
Hi Steffen,
danke für deine Hilfe face-smile echt Klasse!

Ich habe die Ausgangsdatei:

50000..53000

mit Nachfolgendem Code-Schnipsel:

@echo off &setlocal EnableDelayedExpansion
set "infile=test.txt"  
set "outfile=test2.txt"  
set "step=1500"  

for /f "usebackq tokens=1,2 delims=." %%i in ("%infile%") do set /a "begin=%%i, end=%%j"  
set "s=%begin%.."  
set /a "begin+=step, n=begin"  

for /l %%i in (%begin% %step% %end%) do (
  set /a "n=%%i-1"  
  set "s=!s!!n!;%%i.."  
  set /a "n=%%i"  
)

if %n%==%end% (set "s=%s:~,-2%") else set "s=%s%%end%"  
set "s=%s%;"  
>"%outfile%" echo %s%  

Nachfolgenden Ausgang:

50000..51499;51500..52999;53000;

Ich würde aber gerne folgenden Ausgang haben:

TEST;50000..51499;1500;TEST;51500..52999;1500;TEST;53000;1;

face-smile
Member: rubberman
Solution rubberman May 27, 2019 at 16:54:38 (UTC)
Goto Top
Das was du hier tust nennt sich Scope Creeping. Ich bin dann auch mal weg ...
@echo off &setlocal EnableDelayedExpansion
set "infile=test.txt"  
set "outfile=test2.txt"  
set "step=1500"  
set "txt=TEST"  

for /f "usebackq tokens=1,2 delims=." %%i in ("%infile%") do set /a "begin=%%i, end=%%j"  
set "s=%txt%;%begin%.."  
set /a "n=begin, begin+=step"  

for /l %%i in (%begin% %step% %end%) do (
  set /a "d=%%i-n, n=%%i-1"  
  set "s=!s!!n!;!d!;%txt%;%%i.."  
  set /a "n=%%i"  
)

set /a "d=end-n+1"  
if %n%==%end% (set "s=%s:~,-2%;%d%;") else set "s=%s%%end%;%d%;"  

>"%outfile%" echo %s%  
Member: freshman2017
freshman2017 Aug 18, 2019 at 17:21:00 (UTC)
Goto Top
Zitat von @rubberman:

Das was du hier tust nennt sich Scope Creeping. Ich bin dann auch mal weg ...
@echo off &setlocal EnableDelayedExpansion
> set "infile=test.txt"  
> set "outfile=test2.txt"  
> set "step=1500"  
> set "txt=TEST"  
> 
> for /f "usebackq tokens=1,2 delims=." %%i in ("%infile%") do set /a "begin=%%i, end=%%j"  
> set "s=%txt%;%begin%.."  
> set /a "n=begin, begin+=step"  
> 
> for /l %%i in (%begin% %step% %end%) do (
>   set /a "d=%%i-n, n=%%i-1"  
>   set "s=!s!!n!;!d!;%txt%;%%i.."  
>   set /a "n=%%i"  
> )
> 
> set /a "d=end-n+1"  
> if %n%==%end% (set "s=%s:~,-2%;%d%;") else set "s=%s%%end%;%d%;"  
> 
>>"%outfile%" echo %s%  
> 

Hi rubberman,

kannst Du mir vielleicht nochmal helfen? Was muss ich anpassen, damit auch eine Ausgangsdatei, die wie folgt aufgebaut ist, funktioniert:

50..1500,1600..1800

Beste Grüße