ubuntuusers.de

Einfache Shell aufgabe. 2 Dateien zusammenfügen.

Status: Ungelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

Blackwater-Park

Anmeldungsdatum:
28. September 2010

Beiträge: 25

Hallo miteinander,

ich habe eine Datei (eins.dat) mit 2 Spalten und eine zweite Datei (zwei.dat) mit vier Spalten. Nun will ich die vierte Spalte von zwei.dat zu eins.dat hinzufügen. Das Problem habe ich folgendermassen gelöst:

1
2
3
4
cut zwei.dat -f 4 > temp01.dat
paste eins.dat temp01.dat > temp02.dat
mv temp02.dat eins.dat
rm temp01.dat

Das ist sehr unelegant und man benötigt Hilfsdateien, welche wahrscheinlich überflüssig sind. Gibt es eine einfachere Variante? Ich hab ein bisschen mit dem Pipe-Operator (|) rumgespielt, aber nichts hilfreiches zustande bekommen. Bin noch ein relativer Anfänger in Bash Sachen. Vielen Dank

Grüße, bwp

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13174

Blackwater-Park schrieb:

Das ist sehr unelegant und man benötigt Hilfsdateien, welche wahrscheinlich überflüssig sind. Gibt es eine einfachere Variante? Ich hab ein bisschen mit dem Pipe-Operator (|) rumgespielt, aber nichts hilfreiches zustande bekommen. Bin noch ein relativer Anfänger in Bash Sachen. Vielen Dank

So müsste es gehen:

1
2
cut -f 4 zwei.dat | paste eins.dat - >|tmp
mv -f tmp eins.dat

Eine temporäre Datei brauchst Du wegen der Ersetzung.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Oder man nimmt dafür einfach awk (oder eine andere Programmiersprache des Vertrauens). Die kann nämlich mehrere Dateien "parallel" lesen:

track@track:~$ echo 'einsA1 einsB1
> einsA2 einsB2
> einsA3 einsB3
> einsA4 einsB4'  >  eins.dat
track@track:~$ echo 'zweiA1 zweiB1 zweiC1 zweiD1
> zweiA2 zweiB2 zweiC2 zweiD2
> zweiA3 zweiB3 zweiC3 zweiD3
> zweiA4 zweiB4 zweiC4 zweiD4'  >  zwei.dat
track@track:~$ awk '{ getline f1 < "eins.dat"; print f1, $4 }'  zwei.dat
einsA1 einsB1 zweiD1
einsA2 einsB2 zweiD2
einsA3 einsB3 zweiD3
einsA4 einsB4 zweiD4
track@track:~$ awk '{ printf "%s ", $0; getline < "zwei.dat" ; print $4 }'  eins.dat
einsA1 einsB1 zweiD1
einsA2 einsB2 zweiD2
einsA3 einsB3 zweiD3
einsA4 einsB4 zweiD4 

LG,

track

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13174

track schrieb:

Oder man nimmt dafür einfach awk (oder eine andere Programmiersprache des Vertrauens).

Auch da braucht man die temporäre Datei, wenn das Ergebnis an der ursprünglichen Stelle liegen soll.

Die kann nämlich mehrere Dateien "parallel" lesen:

Das ist schick, aber ich würde trotzdem das einfachere Programm (paste) vorziehen.

Ciao

robert

Blackwater-Park

(Themenstarter)

Anmeldungsdatum:
28. September 2010

Beiträge: 25

Danke euch, das hilft schon sehr ☺

elostio

Avatar von elostio

Anmeldungsdatum:
2. Februar 2006

Beiträge: 424

Wohnort: Guayaquil

Eine temporäre Datei brauchst Du wegen der Ersetzung.

1
echo "$(cut -f 4 zwei.dat | paste -d' ' eins.dat - )" >| eins.dat

Blackwater-Park

(Themenstarter)

Anmeldungsdatum:
28. September 2010

Beiträge: 25

elostio schrieb:

Eine temporäre Datei brauchst Du wegen der Ersetzung.

1
echo "$(cut -f 4 zwei.dat | paste -d' ' eins.dat - )" >| eins.dat

Das ist super, danke ☺

Blackwater-Park

(Themenstarter)

Anmeldungsdatum:
28. September 2010

Beiträge: 25

Das schöne ist, dass ich an dem Beispiel Sachen lerne, die ich dann bei anderen Problemen anwenden kann. Danke

Antworten |