93578
Goto Top

Eine Textdatei auf mehrere Dateien alphabetisch aufteilen. Kriterium - erste 2 Buchstaben

Hallo an alle,

ich habe eine große Textdatei.


Diese Datei will ich auf mehrere kleinere Dateien aufteilen und zwar nach erste 2 Buchstaben in alphabetischer Reihenfolge:


aa.txt
ab.txt
ac.txt
ad.txt
..
ba.txt
bb.txt
...

za.txt
zb.txt
...
zz.txt

Weiß jemand wie ich das einstellen kann?

Bis jetzt habe ich folgendes Script benutzt, um die Dateien nach ersten Buchstaben aufteilen:

cat file.txt | grep -i '^a' > a.txt  
cat file.txt | grep -i '^b' > b.txt  
cat file.txt | grep -i '^c' > c.txt  
cat file.txt | grep -i '^d' > d.txt  
cat file.txt | grep -i '^e' > e.txt  
cat file.txt | grep -i '^f' > f.txt  
cat file.txt | grep -i '^g' > g.txt  
cat file.txt | grep -i '^h' > h.txt  
cat file.txt | grep -i '^i' > i.txt  
cat file.txt | grep -i '^j' > j.txt  
cat file.txt | grep -i '^k' > k.txt  
cat file.txt | grep -i '^l' > l.txt  
cat file.txt | grep -i '^m' > m.txt  
cat file.txt | grep -i '^n' > n.txt  
cat file.txt | grep -i '^o' > o.txt  
cat file.txt | grep -i '^p' > p.txt  
cat file.txt | grep -i '^q' > q.txt  
cat file.txt | grep -i '^r' > r.txt  
cat file.txt | grep -i '^s' > s.txt  
cat file.txt | grep -i '^t' > t.txt  
cat file.txt | grep -i '^u' > u.txt  
cat file.txt | grep -i '^v' > v.txt  
cat file.txt | grep -i '^w' > w.txt  
cat file.txt | grep -i '^x' > x.txt  
cat file.txt | grep -i '^y' > y.txt  
cat file.txt | grep -i '^z' > z.txt  
cat file.txt | grep -i '^[0-9]' > 09.txt  
cat file.txt | grep -i '^[[:punct:]|[:space:]]' > symbole.txt  

Wie kann man diesen Script für die neue Aufgabe abändern? Ja, ich weiß, man kann auch diesen Script irgendwie eleganter lösen, aber ich habe nur rudimentäre Kenntnisse im Linux.

Content-Key: 372424

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

Ausgedruckt am: 29.03.2024 um 14:03 Uhr

Mitglied: 136037
136037 27.04.2018 aktualisiert um 12:48:34 Uhr
Goto Top
Einzeiler...
cat test.txt | gawk '{print $0 >>tolower(substr($0,0,2))".txt"}'  
oder auch
for x in $(cat test.txt);do echo $x>>$(echo "${x:0:2}" | tr '[:upper:]' '[:lower:]').txt ;done  
usw.
ich habe nur rudimäntere
Welcher Rudi mit welchem Mantel face-smile??
Mitglied: 93578
93578 27.04.2018 um 11:30:26 Uhr
Goto Top
Danke! Korrigiert. face-wink
Mitglied: 93578
93578 27.04.2018 aktualisiert um 11:55:48 Uhr
Goto Top
Mit sort dauert mir zu lange - die Datei ist ca. 200 GB - 1 TB groß (in der Zukunft). face-sad
Mitglied: 136037
136037 27.04.2018 aktualisiert um 12:36:47 Uhr
Goto Top
Das zwischengeschaltete sort kannst du auch weglassen geht ebenso und dann kannst du später nur in den einzelnen Dateien sortieren:
gawk '{print $0 >>substr($0,0,2)".txt"}' test.txt  
for x in $(echo {a..z}{a..z}.txt);do [ -f "$x" ] && sort -o "$x" "$x";done  
200 GB - 1 TB groß
Dann solltest du dringend dein Konzept mit Textdateien überdenken und auf Datenbank switchen.
Mitglied: 93578
93578 27.04.2018 aktualisiert um 12:30:00 Uhr
Goto Top
Variant 1 funktioniert nicht korrekt. Ich bekomme jeweils 2 Dateien für 1 Buchstabe (z.B.: A.txt und a.txt), aber nicht aa.txt, ab.txt, ac.txt...
Varinat 2 probiere ich gleich.
Mitglied: 136037
136037 27.04.2018 aktualisiert um 12:37:15 Uhr
Goto Top
Zitat von @93578:

Variant 1 funktioniert nicht korrekt. Ich bekomme jeweils 2 Dateien für 1 Buchstabe (z.B.: A.txt und a.txt), aber nicht aa.txt, ab.txt, ac.txt...
Du hast es oben in deinem Skript selbst als a.txt b.txt usw. ausgeben, und nicht nach aa.txt usw, du widersprichst dir selbst face-smile, das kannst du aber leicht ändern wenn du dir mal die Doku zu awk durchlesen würdest.
Erst denken dann eindeutig und verständlich beschreiben....

Zur Info: Ist im letzten Beispiel auf zwei Buchstaben aktualisiert...
Mitglied: Lochkartenstanzer
Lochkartenstanzer 27.04.2018 aktualisiert um 12:34:05 Uhr
Goto Top
Zitat von @136037:

Einzeiler...
> cat test.txt | sort | gawk '{print $0 >>substr($0,0,1)".txt"}'  
> 

Dat Sortieren ist unnötig min Jung. und kost' nur Zeit.

lks
Mitglied: 136037
136037 27.04.2018 aktualisiert um 12:35:48 Uhr
Goto Top
Er wollte es in den Zieldateien aber "alphabetisch" face-smile. Er kann es hinterher effektiver in den Einzeldateien nachsortieren.
Mitglied: 93578
93578 27.04.2018 aktualisiert um 12:38:35 Uhr
Goto Top
Nein, du liest NUR nicht aufmerksam. Ich habe diesen Beispielskript früher benutzt und alles gut und schnell funktionierte.

Aber da die ursprungliche Datei "file.txt" immer größer wird, brauche ich Scriptänderung damit nicht eine, sondern zwei erste Buchstaben als Auswahlkriterium für neue txt-Dateien dienen.

Die Inhalte von neuen Dateien aa.txt, ab.txt-zz.txt sollen nicht unbedngt sortiert werden.
Mitglied: 136037
Lösung 136037 27.04.2018 aktualisiert um 12:41:42 Uhr
Goto Top
Zitat von @93578:
Die Inhalte von neuen Dateien aa.txt, ab.txt-zz.txt sollen nicht unbedngt sortiert werden.
Na dann reicht ja
gawk '{print $0 >>tolower(substr($0,0,2))".txt"}' test.txt   
Mitglied: 93578
93578 27.04.2018 um 12:40:58 Uhr
Goto Top
Variant 2 läuft dementsprechend auch falsch.
Mitglied: 136037
136037 27.04.2018 um 12:41:55 Uhr
Goto Top
Zitat von @93578:

Variant 2 läuft dementsprechend auch falsch.
Nein, siehe letztes Kommentar.
Mitglied: 93578
93578 27.04.2018 um 12:43:53 Uhr
Goto Top
Ja, diese Varinate funktioniert perfekt! Vielen Dank!!!!!!!!!!!! Schöne Feiertage!