bash: dateien_zusammenbauen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
mato
Beiträge: 59
Registriert: 27.07.2010 22:18:03

bash: dateien_zusammenbauen

Beitrag von mato » 27.02.2013 15:15:14

Hallo Debianer,

ich habe mal wieder eines der etwas perverseren
Bashprobleme.

Ich habe ein paar Dateien mit jeweils 1 Spalte Daten.
Die Zeilenanzahl ist bei allen Dateien gleich.
Jetzt moechte ich eine Datei haben, die mir alle Spalten
nebeneinander anzeigt.

Beispiel:
Ich habe datei1 :
1
1
1
1

Ich habe datei2 :
2
2
2
2

Ich moechte eine Datei :

1 2
1 2
1 2
1 2

Ich komme zu keiner anstaendigen Loesung. Ich finde weder
bei meinen sed & awk Infos noch im Internet etwas.
Wer weiss Rat?

Gruss aus dem Schwarzen Wald
Mato

Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: bash: dateien_zusammenbauen

Beitrag von Liffi » 27.02.2013 15:37:03

Mit AWK:

Code: Alles auswählen

#!/bin/bash

awk  '
  BEGIN {
          # ARRAY mit Inhalt von datei1
          while ( getline < "datei1" > 0 )
            {
              f1_counter++
              f1[f1_counter] = $1
            }
  }
  { 
    print f1[NR], $1
   } ' datei2

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: bash: dateien_zusammenbauen

Beitrag von Cae » 27.02.2013 15:50:57

Du suchst paste(1).

Code: Alles auswählen

$ printf '1\n1\n1\n1\n' >1
$ printf '2\n2\n2\n2\n' >2
$ paste 1 2
1	2
1	2
1	2
1	2
$ 
Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

uname
Beiträge: 12406
Registriert: 03.06.2008 09:33:02

Re: bash: dateien_zusammenbauen

Beitrag von uname » 27.02.2013 16:24:07

Geht auch so.

Code: Alles auswählen

i=0;for x in $(cat 1.txt);do i=$[$i+1]; awk 'NR=='"${i}"' {printf"\n" $0}'  1.txt; awk 'NR=='"${i}"' {printf" " $0}' 2.txt;done
Wer kann das Programm verbessern:
1.) kann man "i" anders initialisieren?
2.) kann "for" auch direkt die Zeilen durchnummerieren, um statt x und i nur eine Variable zu nutzen?
3.) wie kann man das mit dem Newline besser lösen?
4.) kann man die Variable "i" auch einfacher in AWK reinbekommen?

Natürlich ist die Laufzeit des Programms nicht optimal. Bei sehr vielen Zeilen könnte man besser echte Software schreiben.

Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: bash: dateien_zusammenbauen

Beitrag von Liffi » 27.02.2013 16:50:56

Warum nur vergesse ich immer und immer wieder paste.

Bin ich AWK Masochist? ;-)

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: bash: dateien_zusammenbauen

Beitrag von Cae » 27.02.2013 17:03:31

Warum die eine Datei komplett in den Speicher lesen?

Code: Alles auswählen

$ printf '1\n1\n1\n1\n' >1
$ printf '2\n2\n2\n2\n' >2
$ awk 'BEGIN { while (getline one < "1" && getline two < "2") print one "\t" two; }'
1	2
1	2
1	2
1	2
$ 
:mrgreen:

Wobei sich das anders als paste verhaelt, bei ungleich langen Dateien wird beim Ende der kuerzeren aufgehoert. Unhandliche Alternative:

Code: Alles auswählen

$ awk 'BEGIN { while (!e) {
	if (!getline one < "1") { e = 1; one = ""; };
	if (!getline two < "2") { e = 1; two = ""; };
	print one "\t" two; }
}'
1	2
1	2
1	2
1	2
1	
Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: bash: dateien_zusammenbauen

Beitrag von Liffi » 27.02.2013 17:13:24

Ich verneige mein Haupt (und schlage mein awk&sed Buch von Herold auf um schlauer zu werden).

uname
Beiträge: 12406
Registriert: 03.06.2008 09:33:02

Re: bash: dateien_zusammenbauen

Beitrag von uname » 27.02.2013 17:53:48

Mein Programm war auch Müll. Danke für die Alternative.

Benutzeravatar
Meillo
Moderator
Beiträge: 9239
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: bash: dateien_zusammenbauen

Beitrag von Meillo » 27.02.2013 19:54:55

paste(1) macht genau das was gewuenscht ist, es nicht zu verwenden waere ein grosser Fehler.

Ich bin ein grosser Fan von awk, aber nur weil awk vieles auf einfache Weise ermoeglicht was mit sh kompliziert oder nicht portabel ist. Die Motivation muss immer sein das Programm so einfach wie moeglich zu machen. Keiner der anderen Vorschlaege ist auch nur annaehernd so einfach wie `paste a b'.
Use ed once in a while!

mato
Beiträge: 59
Registriert: 27.07.2010 22:18:03

Re: bash: dateien_zusammenbauen

Beitrag von mato » 03.03.2013 18:46:49

Hallo Debianer,

vielen Dank fuer die vielen Antworten.

Paste ist wirklich das, was ich gesucht habe und
Ich meine bei den uebrigen Loesungen verkuenstelt man sich
unnoetig.

an Lifi :
****Bin ich AWK Masochist?***

Grundsaetzlich ist daran doch nichts falsch.

Nochmals vielen Dank und
Gruss aus dem Schwarzen Wald,
Mato

wanne
Moderator
Beiträge: 7552
Registriert: 24.05.2010 12:39:42

Re: bash: dateien_zusammenbauen

Beitrag von wanne » 03.03.2013 19:18:24

Meillo hat geschrieben:oder nicht portabel ist.
Wenn mich nicht alles täuscht müsste sich awk mit posix-konformem sh simulieren lassen. Ist alles turing-vollständig. Uns syscalls die awk kann, kann die sh auch.
Meillo hat geschrieben:was mit sh kompliziert
Da hast du natürlich recht. Und da stimme ich dir auch voll und ganz zu.
rot: Moderator wanne spricht, default: User wanne spricht.

Benutzeravatar
Meillo
Moderator
Beiträge: 9239
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: bash: dateien_zusammenbauen

Beitrag von Meillo » 07.03.2013 10:43:46

wanne hat geschrieben:
Meillo hat geschrieben:oder nicht portabel ist.
Wenn mich nicht alles täuscht müsste sich awk mit posix-konformem sh simulieren lassen. Ist alles turing-vollständig.
Wozu? Awk ist ein (wenn auch optionaler) Teil von POSIX. Awk hat sich (wenn man oawk (vor 1985) ausklammert) ueber die Jahre wenig veraendert. Das sind gute Vorraussetzungen awk zu verwenden.
Use ed once in a while!

wanne
Moderator
Beiträge: 7552
Registriert: 24.05.2010 12:39:42

Re: bash: dateien_zusammenbauen

Beitrag von wanne » 07.03.2013 11:48:55

Ich habe nicht gesagt das es sinnvoll ist. (Das es an vielen Stellen sinnvoll ist awk zu verwenden weil es kürzer/schöner ist finde ich richtig. Da stimme ich dir auch zu.)
Ich habe dir nur wiedersprochen, dass es nicht auch ohne geht.
rot: Moderator wanne spricht, default: User wanne spricht.

Benutzeravatar
Meillo
Moderator
Beiträge: 9239
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: bash: dateien_zusammenbauen

Beitrag von Meillo » 07.03.2013 12:36:46

wanne hat geschrieben:Ich habe dir nur wiedersprochen, dass es nicht auch ohne geht.
Habe ich gesagt, dass es nicht auch ohne geht?

Ich glaube hier handelt es sich um failure to communicate. ;-)
Use ed once in a while!

Antworten