• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Textformatierung

A

Anonymous

Gast
Wie würde man es hinbekommen, dass 2 individuell über variablen erzeugte textblöcke innerhalb einer datei aneinandergereiht werden?
:arrow:
Code:
AAAA
BBBB
CCCC
DDDD
11111
22222
33333
44444
und nun soll das ergebnis so aussehen:
Code:
AAAA 11111
BBBB 22222
CCCC 33333
DDDD 44444
hab schon versucht mit den regexs mit sed und awk rumzuspielen, jedoch fiel mir grad nichts passendes auf :shock: . Kann mich ma jemand aus der Gruft der Unwissenheit erlösen?
1234 und ABCD verändern sich übrigens oft, also ist ein explizites suchen nach bestimmten begriffen nicht möglich, ich bräuchte eine anweisung, die mir alles aus variable1 in die datei schreibt (ganz normal) und dann alles aus variable2 direkt dahinter, so wie oben gezeigt. Die anzahl der zeilen der inhalte der beiden variablen sind immer gleich, die werte sind voneinander abhängig
 
OP
A

Anonymous

Gast
nein, diese anzahl wird sich im laufe der zeit immer weiter erhöhen....leider :shock: . Kannst du mir trotzdem helfen?
 

Erlenmayr

Member
rm -rf / schrieb:
nein, diese anzahl wird sich im laufe der zeit immer weiter erhöhen....leider :shock: . Kannst du mir trotzdem helfen?
Ist es denn immer eine gerade Anzahl von Zeilen?

Kann man quasi sagen: (n ist die Zeilenanzahl)

Zeile(1) Zeile(1/2n+1)
Zeile(2) Zeile(1/2n+2)
...
Zeile(1/2n) Zeile(n)

?
 
OP
A

Anonymous

Gast
Erlenmayr schrieb:
Ist es denn immer eine gerade Anzahl von Zeilen?
auch nicht... es kommen immer einzelne einträge hinzu (also einmal 55555 und einmal EEEEE, das kommt immer im doppelpack)

Beispiel:
Code:
24.12.2000:
AAAA  
BBBB
CCCC
1111
2222
3333
Code:
01.01.2001:
AAAA
BBBB
CCCC
DDDD
1111
2222
3333
4444
Code:
02.01.2001:
AAAA
BBBB
CCCC
DDDD
EEEE
1111
2222
3333
4444
5555
ich könnte es übrigens so einrichten, dass vor die buchstaben oder zahlen ein delimiter hinzugefügt wird, also dürfte die separierung kein problem sein zum Beispiel:
AAAA:
BBBB:
1111
2222
 

TeXpert

Guru
rm -rf / schrieb:
Erlenmayr schrieb:
Ist es denn immer eine gerade Anzahl von Zeilen?
auch nicht... es kommen immer einzelne einträge hinzu (also einmal 55555 und einmal EEEEE, das kommt immer im doppelpack)

Also Du hast immer diese Form:

1. Zeile Blah, blah = Datum oder anderen mist

dann n Zeilen Buchstaben und n zeilen Zahlen wobei zwischen Buchstaben <=> zahlen eine Bijektive Abbildung besteht, die Du entsprechend umschreiben willst (zumindest sagen das alle Deine beispiele).

Das Doppelpack heißt, es wird immer eine zeichen-Zeile und eine Zahl-Zeile hinzugefügt, so dass

Code:
Sternzeit 10293843
AAAA
1234
6789

nicht möglich ist. wenn Doch dann musst Du bitte auch die Umformungsregeln für
Code:
Sternzeit 10293843
AAAA
1234
6789
und
Code:
Sternzeit 10293843
AAAA
BBBB
1234
angeben.

wenns Bash sein muss, dann ganz simpel mit 2 Temp-Files:

Code:
tac input | head -n-1 | tac | tail -n $(( ( $(wc -l < input) - 1) / 2 )) | cat -n > numbers.txt
tac input | head -n-1 | tac | head -n $(( ( $(wc -l < input) - 1) / 2 )) | cat -n > chars.txt
join -o 1.2 2.2 chars.txt numbers.txt

ohne Temp-Files wirds übler, dazu würde ich mit 2 Filedescriptoren arbeiten und die in einer Schleife wechselseitig auslesen. Zu Beginn müssen halt in die Deskriporen die passenden Inhalte reingeschreiben werden (head, tail, tac...)

einfach wird das mit einer richtige Sprache ;)

Code:
#! /usr/bin/perl -w

use strict;

chomp(my @lines=<STDIN>);
shift(@lines);
my $halflc=$#lines / 2;
for (my $line = 0; $line < $halflc ; $line++) {
  print "$lines[$line] $lines[$line + $halflc ]\n";
}
(ungetestet)
 
OP
A

Anonymous

Gast
danke, genau sowas hab ich gesucht:
texpert schrieb:
einfach 2 tempfiles für die 2 blöcke erstellen, und die dann zu joinen scheint mir die einfachste lösung. Nochmal danke für die kompetente Hilfe
 
OP
A

Anonymous

Gast
leider muss ich dir mitteilen, dass dein bash-script fehlerhaft (?) ist,
Code:
head -n-1 | tac | tail -n $(( ( $(wc -l < input) - 1) / 2 ))
ist völlig unnötig, und kürzt nur alles.......(absicht?)
ein
Code:
echo "$var1" | cat -n > var1
echo "$var2" | cat -n > var2
join -i -o 1.2 2.2 var1 var2
reicht völlig aus, trotzdem danke
 

TeXpert

Guru
rm -rf / schrieb:
leider muss ich dir mitteilen, dass dein bash-script fehlerhaft (?) ist,
Code:
head -n-1 | tac | tail -n $(( ( $(wc -l < input) - 1) / 2 ))
ist völlig unnötig, und kürzt nur alles.......(absicht?)

Ausgangspunkt war doch, dass in einer Datei alles drinsteht mit einer Datumskopfzeile, dann musst Du erst mal die Kopfzeile abschneiden (tac, letzte zeile weg, tac) und dann stehen nur noch Zeichen und Zahlen drin, jetzt halbieren um den Input zu trennen.

ein
Code:
echo "$var1" | cat -n > var1
echo "$var2" | cat -n > var2
join -i -o 1.2 2.2 var1 var2
reicht völlig aus, trotzdem danke
OK, wenn Du es vorher trennen kannst ist das latürnich die kürzeste Lösung, aber ich bin ja von den fertigen Ausgabedateien ausgegangen.
 
OP
A

Anonymous

Gast
achso, dann war da natürlich ein missverständnis am werk :shock:. Auf jeden Fall hab ichs jetzt so, wie ich es wollte:

aaaaa 11111
bbbbb 22222 usw..

auf die -o option von join wär ich niemals allein gekommen, kannst du vielleicht kurz schreiben, wo die "-o" option von join genau beschrieben wird? Dann wüsste ich wenigstens für die zukunft wie man das format handhaben muss.
 
Versuch mal:
info join

Haveaniceday

Edit: Achtung bei join, join erwartet vorsortierte Listen.
Ohne Vorsortierung klappt es nicht. Ist hier aber durch die Numerierung gegeben.
Achte mal darauf, obe es in dem Skript mit mehr als 18 Zeilen klappt.
Join erwartet nämlich ein "ascii sort".
Und 1 11 12 ... 2 21 wäre die richtige Reihenfolge.
 

TeXpert

Guru
haveaniceday schrieb:
Versuch mal:
info join

ein info join liefert nur die manpage, denn die richtige Doku steckt in info coreutils join ;)

mit der Sortierung:

ich zitiere aus der Infopage:
Code:
  Normally, the sort order is that of the collating sequence specified
by the `LC_COLLATE' locale.  Unless the `-t' option is given, the sort
comparison ignores blanks at the start of the join field, as in `sort
-b'.  If the `--ignore-case' option is given, the sort comparison
ignores the case of characters in the join field, as in `sort -f'.
 
TeXpert schrieb:
ein info join liefert nur die manpage, denn die richtige Doku steckt in info coreutils join ;)

Bei mir liefert "info join" genau diese info coreutils join Seite und nicht die "man" Seite.
( SuSe 9.3, Nur so als Anmerkung am Rande, weiß nicht ob es sonst wo anders ist)

Ciao,

Haveaniceday
 

TeXpert

Guru
tja :) aber immerhin steht bei mir in der manpage dieser Hinweis drin :p die kleinen aber feinen Unterschiede...
 
Oben