Datei in 2 sichtbare Spalten trennen
Datei in 2 sichtbare Spalten trennen
Hallo,
bekomme die formatierte Ausgabe nicht so ganz hin. Ich möchte, dass die Ausgabe in 2 Spalten unterteilt ist und das der Text in beiden Spalten jeweils linksbündig (zur Spalte) ist.
Das Problem ist, dass der erste String so zwischen 80 und 90 Zeichen groß ist und der zweite String aus 6-10 Zeichen besteht.
Habe es mit awk und printf und %s versucht, aber wenn ich den ersten String komplett haben möchte, habe ich keine direkten, sichtbaren Spalten. Es ist halt alles ein wenig verrückt.
bekomme die formatierte Ausgabe nicht so ganz hin. Ich möchte, dass die Ausgabe in 2 Spalten unterteilt ist und das der Text in beiden Spalten jeweils linksbündig (zur Spalte) ist.
Das Problem ist, dass der erste String so zwischen 80 und 90 Zeichen groß ist und der zweite String aus 6-10 Zeichen besteht.
Habe es mit awk und printf und %s versucht, aber wenn ich den ersten String komplett haben möchte, habe ich keine direkten, sichtbaren Spalten. Es ist halt alles ein wenig verrückt.
Oh, yeah!
- Mr_Snede
- Beiträge: 2323
- Registriert: 08.07.2003 13:48:49
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Ruhrpott
Wie sehen die Eingangsdaten aus, woher bekommst du sie, wie sind sie voneinander getrennt?
Software Finder - Software in Kategorien Debian ohne Ballast - Tipps für ein schlankes Debian
Re: Datei in 2 sichtbare Spalten trennen
Hi,
Eine andere alternative waere vielleicht ein Perlreport, siehe Perls Reportgenerator.
Bei zahlen zumindest kann man die "Breite" mit angeben , z.B. printf ("%05.2d", meinezahl), das muesste mit Strings auch gehen.Duff hat geschrieben:Habe es mit awk und printf und %s versucht,
Eine andere alternative waere vielleicht ein Perlreport, siehe Perls Reportgenerator.
Roland
"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"
"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"
Datei in 2 sichtbare Spalten trennen
Hallo,
ich denke schon, das das möglich ist. Poste doch einfach mal einen Teil der Datei, damit
der hier dann zerlegt werden kann.
Gruß
Mattthias
ich denke schon, das das möglich ist. Poste doch einfach mal einen Teil der Datei, damit
der hier dann zerlegt werden kann.
Gruß
Mattthias
Die Datei sieht in etwa so aus:
und sollte dann so aussehen:
Code: Alles auswählen
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBBBBB
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC CCCCCCCCC
Code: Alles auswählen
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBBBBB
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC CCCCCCCCC
Oh, yeah!
Hallo duff;
geht das so, oder ist die Datei noch komplizierter?
Gruß fuzzy
Code: Alles auswählen
awk '{print$1"\n "$2}' datei
Gruß fuzzy
Hmm, ich glaube er wollte so etwas haben:
/edit: noch mal ne etwas huebschere version von dem script als extra datei:
Code: Alles auswählen
cat datei | awk '{split($0,a,/\t/);printf("%-80s\t\t%-10s\n",a[1],a[2]);}'
Code: Alles auswählen
#!/usr/bin/awk -f
{
split($0,data,/\t/); # split data at separation points, here 1 tab
# print the data with left orientation and two tabs as seperator
printf("%-80s\t\t%-10s\n",data[1],data[2]);
}
Geht auch mit ShellbordmittelnDas einzig blöde ist, dass IFS ein wirkliches Tabulatorzeichen enthalten muss.Im Emacs würde man dafür z.B. C-Q Tab drücken
Code: Alles auswählen
#!/bin/sh
IFS=" " # Ein TAB-Zeichen
while read a b; do
printf "%-80s %s" $a $b
done
Mmh, leider funktioniert das ganze noch nicht so ganz.
Hier noch mal eine genaueres Aussehen der Datei, die formatiert werden soll:
Das Problem ist die Reihe mit den Bs. Diese wird nie so eingerückt, wie die anderen.
Hier noch mal eine genaueres Aussehen der Datei, die formatiert werden soll:
Code: Alles auswählen
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBBBBB
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC CCCCCCCCC
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD DDDDDDDDD
Oh, yeah!
Oder du nimmst die bash und setzt den IFS auf $'\t'.Joghurt hat geschrieben:Geht auch mit ShellbordmittelnDas einzig blöde ist, dass IFS ein wirkliches Tabulatorzeichen enthalten muss.Im Emacs würde man dafür z.B. C-Q Tab drückenCode: Alles auswählen
#!/bin/sh IFS=" " # Ein TAB-Zeichen while read a b; do printf "%-80s %s" $a $b done
Code: Alles auswählen
#!/bin/bash
IFS=$'\t'
while read a b; do
printf "%-80s %s" $a $b
done
Lösung in Perl:
Code: Alles auswählen
#!/usr/bin/perl
# Datename von der Kommandozeile lesen
my $datei=shift(@ARGV);
# zwei Leerzeichen Abstand
my $abstand=2;
my @data=();
if($datei eq '-')
{
# Von der Standardeingabe lesen
@data=<STDIN>;
}
else
{
# Datei einlesen
open(IN,'<',$datei) or die "Konnte $datei nicht öffnen ($!)\n";
@data=<IN>;
close(IN);
}
# längste Zeile vor den Leerzeichen finden.
my $lang=0;
for my $i (@data)
{
$i=~/^(.+?)\s/;
my $l=length($1);
$lang=$l if($l>$lang);
}
# alles entsprechend einrücken:
for my $i (@data)
{
$i=~/^(.+?)\s+(.+)$/s;
my ($vor,$nach)=($1,$2);
my $anzahl=$lang-length($vor)+$abstand;
$i=$vor." " x $anzahl.$nach;
}
# Ergebnis Ausgeben
print join('',@data);
Danke, beim perl-Script funktioniert die Formatierung. Da ich aber ein Shell-Script benutze, wollte ich nicht noch den Rest auf perl umstellen. Trotzdem Danke. Perl werde ich mir zwar auch noch aneignen aber halt noch nicht jetzt.
Ich habe in dem Shell-Script verschiedene if, elif und else Abfragen. Es wird dann immer, jenachdem in welche der 3 Abfragen man kommt, über geschrieben.
Ich müsste dort dann schon dort mit printf formatieren und nicht erst am Ende die Ausgabe-Datei.
Ich habe in dem Shell-Script verschiedene if, elif und else Abfragen. Es wird dann immer, jenachdem in welche der 3 Abfragen man kommt, über
Code: Alles auswählen
echo $a "\t" $b >> $datei
Ich müsste dort dann schon dort mit printf formatieren und nicht erst am Ende die Ausgabe-Datei.
Oh, yeah!
Danke für alle Antworten.
Habe es nun so gelöst:
bzw. noch ein | sort -k 2 zum Sortieren dahinter.
Habe es nun so gelöst:
Code: Alles auswählen
cat $datei | awk -F" " '{printf("%-90s\t%-20s\n", $1, $2)}'
Oh, yeah!
Nunja, ich hatte das Script so geschrieben, daß du deine Werte dadurch Pipen kannst.
Mal als Beispiel:
Beachte das "-", damit wird von STDIN gelesen.
Du hättest allso keine Zeile Code ändern müssen.
Aber wenn du es schon anders gelöst hast ist auch gut (wobei deine Lösung nicht gerade Flexibel bei den Zeilenlängen ist )
Mal als Beispiel:
Code: Alles auswählen
cat $datei | perl mein_script -
Du hättest allso keine Zeile Code ändern müssen.
Aber wenn du es schon anders gelöst hast ist auch gut (wobei deine Lösung nicht gerade Flexibel bei den Zeilenlängen ist )