netznutzer
Goto Top

Textdatei nach bestimmten Kriterien in mehrere Dateien splitten (AWK??!)

Hallo Admin-Gemeinde,
ich versuche schon seit geraumer Zeit eine Lösung für folgendes Problem zu finden. Ich habe eine Textdatei welche wie folgt aufgebaut ist:

1. Zeile Text
2. Zeile Text
3. Zeile Text

<Tag1>Beschreibung1</Tag1>
<Tag2>Beschreibung</Tag2>

<Tag1>Beschreibung2</Tag1>
<Tag2>Beschreibung</Tag2>

<Tag1>Beschreibung3</Tag1>
<Tag2>Beschreibung</Tag2>

letzte Zeile Text

Nun suche ich einen Weg, diese eine Textdatei in drei Textdateien zu splitten mit dem jeweiligen Inhalt:

1. Zeile Text
2. Zeile Text
3. Zeile Text

<Tag1>Beschreibung[x]</Tag1>
<Tag2>Beschreibung</Tag2>

letzte Zeile Text

Idealerweise sollte der Dateinamen aus der Beschreibung+Suffix zwischen <Tag1></Tag1> bestehen.

Mit "awk" habe ich zumindest zwei Befehlsfolgen entdeckt, die mich etwas weiterbringen. An der Kombination scheitere ich leider.

awk "/Rubrik/{n++}{print > f n}" f=Datei Datei.TXT
awk "NR < 4" Datei.TXT

Auch wenn ich hier im Linux-Foum poste. Am Besten wäre es, lief die ganze Sache in einer MS-DOS-Shell. Vielleicht kann mir jemand behilflich sein?

Besten Dank und Gruß

Content-Key: 195035

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

Ausgedruckt am: 29.03.2024 um 15:03 Uhr

Mitglied: Arano
Arano 28.11.2012 um 12:33:19 Uhr
Goto Top
Tach auch

Auch wenn ich hier im Linux-Foum poste. Am Besten wäre es, lief die ganze Sache in einer MS-DOS-Shell. Vielleicht kann mir jemand behilflich sein?
Da frage ich mich, warum man in den __Schuhladen__ gehen sollte um nach modischen __Hosen__ zufragen !? face-wink

Aber du hast einen glücklichen Tag erwischt !
Normalerweise helfe ich eher jemandem als das ich die Arbeit für ihn erledige... aber ich brauchte was zum ablenken (habe gleich ne theoretische Abschlussprüfung und sitze hier schon ganz hibbelig - ich will looos Oo) und da kam mir deine Frage gerade recht *g*

Allerdings ist es
  1. Nicht sonderlich getestet,
  2. verschluckt es die Leerzeilen und
  3. sind die Dateinamen hart codiert

Aber vielleicht reicht es dir ODER du kannst es noch selber erweitern - sofern es dir so überhaupt nützt !?
Ich muss gleich los, darum "klatsch" ich dir das einfach mal hier hin, viel Spaß und Erfolg, ich muss weg face-smile
@echo off && setlocal enabledelayedexpansion

set "if=a.txt"                       REM Der Name der INPUT-Datei  
if exist teil-1.txt del teil-1.txt   REM Die drei Ausgabedateien
if exist teil-2.txt del teil-2.txt   REM   Änderungen müssen auch im
if exist teil-3.txt del teil-3.txt   REM   weiterem Script gemacht werden !!!

set /a x=1
set "of=1, 2 und 3"  

REM for /f "delims=" %%i in (a.txt) do (  
REM for /f "delims=\n" %%i in ('findstr /n . "%if%"') do (  
for /f "delims=" %%i in (%if%) do (  
    if !x! LEQ 3 (
        REM schreibe Zeile 1-3 in die neuen Dateien
        >>"teil-1.txt" echo.%%i  
        >>"teil-2.txt" echo.%%i  
        >>"teil-3.txt" echo.%%i  
        set "of=1, 2 und 3"  
    ) else if !x! LEQ 5 (
        REM schreibe Zeilen 4+5 in die erste neue Datei
        >>"teil-1.txt" echo.%%i  
        set "of=1"  
    ) else if !x! LEQ 7 (
        REM schreibe Zeilen 6+7 in die zweite neue Datei
        >>"teil-2.txt" echo.%%i  
        set "of=2"  
    ) else if !x! LEQ 9 (
        REM schreibe Zeilen 8+9 in die dritte neue Datei
        >>"teil-3.txt" echo.%%i  
        set "of=3"  
    ) else (
        REM schreibe alles ab Zeile 9 (10,11,12,..) in alle neuen Dateien
        >>"teil-1.txt" echo.%%i  
        >>"teil-2.txt" echo.%%i  
        >>"teil-3.txt" echo.%%i  
        set "of=1, 2 und 3"  
    )
    
    REM gebe info aus
    echo zeile !x!: "%%i": in Datei: !of!  
    REM erhoehe Zeilenzaehler um eins
    set /A x +=1
)


pause
Die Zeile 41 für die Infoausgabe und die "set "of="-Zeilen können gelöscht werden, dienen nur der Info


Achso, zur Info vielleicht noch !
Das Script geht Zeile für Zeile durch und entscheidet einfach anhand der "Zeilennummer" ob der Zeileninhalt in alle, die erste, zweite oder dritte Datei geschrieben werden soll.
Das ist quasi alles


~Arano
Mitglied: TsukiSan
TsukiSan 28.11.2012 aktualisiert um 14:02:18 Uhr
Goto Top
Hallo Netznutzer,

toller Trick!

Auch wenn ich hier im Linux-Foum poste.....
Arano hat es gut versinnbildlicht face-wink

@Arano
Wir drücken dir hier einmal in erster Linie die Daumen für heute!!!!
Wird schon schief gehen!

@Netznutzer

Wenn es Windows sein darf und dann auch noch VBS (und ich schliesse mich Arano an, dass wir eigentlich nicht die Arbeit für andere machen!), dann hätte ich diesen Vorschlag für dich:
Dim FSO

Const DateiName = "C:\"  

Set FSO = CreateObject("Scripting.FileSystemObject")  

TempData = Split(FSO.OpenTextFile("C:\a.txt", 1).ReadAll, vbCrLf)  

For i = 0 To 2
    DieErsten3Zeilen = DieErsten3Zeilen & TempData(i) & vbCrLf
Next

b = 1
For i = 4 To UBound(TempData)
    temp = temp & TempData(i) & vbCrLf
    b = b + 1
    If Not i = UBound(TempData) Then
        If b = 3 Then
            On Error Resume Next
            i = i + 1
            b = 1
            temp1 = Split(temp, vbCrLf)
            temp2 = Split(temp1(0), ">")  
            temp3 = Split(temp2(1), "<")  
            FSO.CreateTextFile(DateiName & temp3(0) & ".txt", True).Write DieErsten3Zeilen & vbCrLf & temp & vbCrLf & TempData((UBound(TempData) - 1))  
            temp = ""  
        End If
    End If
Next

DieErsten3Zeilen = ""  

Set FSO = Nothing

Aber tu dir selber einen Gefallen und versuche das zu verstehen, was hier gepostet wird. Das macht am meisten Spass!

Viele Grüsse

Tsuki
Mitglied: Netznutzer
Netznutzer 28.11.2012 um 16:01:09 Uhr
Goto Top
Hallo Arano, Hallo Tsuki,

Seid versichert, ich möchte meine Arbeit nicht von anderen erledigen lassen, noch ihnen unötige Arbeit bereiten face-smile Für die Beiden Vorschläge danke ich euch vielmals! Ich werde sie die Tage testen und selbstverständlich verstehen wollen. Dazu Bedarf es meinerseit aber einige Einarbeitungszeit; habt ihr sicher gemerkt ;)

Viele Grüße, Netznutzer