Datei in 2 sichtbare Spalten trennen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Datei in 2 sichtbare Spalten trennen

Beitrag von Duff » 21.07.2006 14:41:49

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.
Oh, yeah!

Benutzeravatar
Mr_Snede
Beiträge: 2323
Registriert: 08.07.2003 13:48:49
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Ruhrpott

Beitrag von Mr_Snede » 21.07.2006 15:45:30

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

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Re: Datei in 2 sichtbare Spalten trennen

Beitrag von roli » 21.07.2006 15:57:11

Hi,
Duff hat geschrieben:Habe es mit awk und printf und %s versucht,
Bei zahlen zumindest kann man die "Breite" mit angeben , z.B. printf ("%05.2d", meinezahl), das muesste mit Strings auch gehen.
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"

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 21.07.2006 16:07:08

Schon mal danke.

Die Input-Datei sieht so aus, dass in einer for-Schleife der 1.String, tab-Zeichen, 2.String kommt und dann über >> in eine Datei geschrieben wird.

Würde das ganze gerne über die SHELL-Kommandos regeln (wenn's möglich ist).
Oh, yeah!

Methusalix

Datei in 2 sichtbare Spalten trennen

Beitrag von Methusalix » 22.07.2006 00:20:06

Hallo,

ich denke schon, das das möglich ist. Poste doch einfach mal einen Teil der Datei, damit
der hier dann zerlegt werden kann. :wink:
Gruß
Mattthias

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 24.07.2006 12:34:14

Die Datei sieht in etwa so aus:

Code: Alles auswählen

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA   AAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB         BBBBBBBB
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC         CCCCCCCCC
und sollte dann so aussehen:

Code: Alles auswählen

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA         AAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB               BBBBBBBB
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC         CCCCCCCCC

Oh, yeah!

fuzzy
Beiträge: 1021
Registriert: 04.10.2003 12:15:52

Beitrag von fuzzy » 24.07.2006 17:28:00

Hallo duff;

Code: Alles auswählen

awk '{print$1"\n "$2}' datei
geht das so, oder ist die Datei noch komplizierter?

Gruß fuzzy

_mh_
Beiträge: 171
Registriert: 10.07.2006 11:52:28

Beitrag von _mh_ » 24.07.2006 17:55:47

Hmm, ich glaube er wollte so etwas haben:

Code: Alles auswählen

cat datei | awk '{split($0,a,/\t/);printf("%-80s\t\t%-10s\n",a[1],a[2]);}'
/edit: noch mal ne etwas huebschere version von dem script als extra datei:

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]);  
}

fuzzy
Beiträge: 1021
Registriert: 04.10.2003 12:15:52

Beitrag von fuzzy » 24.07.2006 18:32:33

:oops:

Gruß fuzzy

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 24.07.2006 21:26:08

Geht auch mit Shellbordmitteln

Code: Alles auswählen

#!/bin/sh
IFS=" " # Ein TAB-Zeichen
while read a b; do
 printf "%-80s %s" $a $b
done
Das 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

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 24.07.2006 21:28:08

Danke für die vielen Möglichkeiten.
Werde sie gleich mal probieren :idea:
Oh, yeah!

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Beitrag von nepos » 24.07.2006 22:59:01

Das 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
In vim STRG+V TAB.

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 25.07.2006 16:42:57

Mmh, leider funktioniert das ganze noch nicht so ganz.

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
Das Problem ist die Reihe mit den Bs. Diese wird nie so eingerückt, wie die anderen.
Oh, yeah!

tobreh
Beiträge: 32
Registriert: 09.04.2003 08:21:26

Beitrag von tobreh » 25.07.2006 17:00:30

Joghurt hat geschrieben:Geht auch mit Shellbordmitteln

Code: Alles auswählen

#!/bin/sh
IFS=" " # Ein TAB-Zeichen
while read a b; do
 printf "%-80s %s" $a $b
done
Das 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
Oder du nimmst die bash und setzt den IFS auf $'\t'.

Code: Alles auswählen

#!/bin/bash
IFS=$'\t'
while read a b; do
 printf "%-80s %s" $a $b
done

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 25.07.2006 22:20:36

Werde es morgen mal probieren.

Wird doch wohl auch unter der ksh funktionieren :idea:
Oh, yeah!

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 25.07.2006 23:39:11

Kann es sein, dass in der Eingabedatei die Zeile mit den Bs mehr oder weniger Tabs enthält als die anderen?

ToPeG
Beiträge: 437
Registriert: 14.04.2004 00:42:06

Beitrag von ToPeG » 26.07.2006 06:09:32

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);

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 26.07.2006 09:23:52

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

Code: Alles auswählen

echo $a "\t" $b >> $datei
geschrieben.

Ich müsste dort dann schon dort mit printf formatieren und nicht erst am Ende die Ausgabe-Datei.
Oh, yeah!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 26.07.2006 16:33:05

Danke für alle Antworten.

Habe es nun so gelöst:

Code: Alles auswählen

cat $datei | awk -F" " '{printf("%-90s\t%-20s\n", $1, $2)}' 
bzw. noch ein | sort -k 2 zum Sortieren dahinter.
Oh, yeah!

ToPeG
Beiträge: 437
Registriert: 14.04.2004 00:42:06

Beitrag von ToPeG » 27.07.2006 23:04:29

Nunja, ich hatte das Script so geschrieben, daß du deine Werte dadurch Pipen kannst.
Mal als Beispiel:

Code: Alles auswählen

cat $datei | perl mein_script - 
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 ;-) )

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 28.07.2006 08:16:21

Stimmt, da hast du natürlich recht.

Denke, dass ich auf dein Script zurückgreifen werde. Danke.
Oh, yeah!

Antworten