ubuntuusers.de

Zwei dateien zeilenweise Joinen

Status: Ungelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

dakkar

Avatar von dakkar

Anmeldungsdatum:
1. Juni 2006

Beiträge: 282

Hola

Ich such eine elegante Möglichkeit zwei Dateien zielenweise zusammenzusetzen.

Beispiel:

File1:
11
12
13
14
File2
21
22
23
24

Das Ergebnis soll sein:

11
21
12
22
13
23
14
24

*winke* Dakky

x-haui

Anmeldungsdatum:
18. September 2007

Beiträge: 111

Hallo,

vielleicht hilft die dieses Skript weiter:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/perl

use strict;
use warnings;

if (@ARGV != 2){
	print "Usage: $0 file1 file2\n";
	exit 1;
}
open my $file1, "<", $ARGV[0] or die "Couldn't open $ARGV[0] -- $!";
open my $file2, "<", $ARGV[1] or die "Couldn't open $ARGV[1] -- $!";

while (my $line1 = <$file1>){
	print $line1;
	last if(! defined(my $line2 = <$file2>));
	print $line2;
}
print <$file1>;
print <$file2>;

close($file1);
close($file2);

Falls die Dateien unterschiedlich lang sind, schreibt das Skript die letzten Zeilen der längeren Datei auch noch mit raus - falls das nicht gewünscht ist, einfach die Zeilen 18 und 19 auskommentieren.

Als Bash-Einzeiler ginge obiges auch so

1
i=0; while read line; do echo $line; ((i++)); head -n $i file2 | tail -n 1;done < file1

Das ist aber m.E. kein bisschen elegant und bei längeren Dateien recht langsam. Zudem bekommst du bei unterschiedlich langen Dateien mitunter ein ungewolltes Ergebnis. 😉

diesch Team-Icon

Avatar von diesch

Anmeldungsdatum:
18. Februar 2009

Beiträge: 5072

Wohnort: Brandenburg an der Havel

paste -d '\n' File1 File2

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

Was soll denn mit den überschüssigen Zeilen passieren, wenn eine Datei mehr Zeilen hat als die andere?

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

Hihi...

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
~$ cat File1
11
12
13
14
~$ cat File2
21
22
23
24
~$ python -c "open('File3', 'w').writelines((''.join(line) for line in zip(open('File1'), open('File2'))))"
~$ cat File3
11
21
12
22
13
23
14
24

Schließt die Dateien allerdings nicht ordentlich und sieht auch unschön aus, aber ein Einzeiler aus der Bash. 😉 Außerdem funktioniert das nur bei gleich vielen Zeilen und sie sollten jeweils mit einer leeren Zeile (sprich: Newline) enden.

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

x-haui schrieb:

Als Bash-Einzeiler ginge obiges auch so

1
i=0; while read line; do echo $line; ((i++)); head -n $i file2 | tail -n 1;done < file1

Und so schreibt es das Ergebnis in File3:

1
(i=0; while read line; do echo $line; ((i++)); head -n $i File2 | tail -n 1;done < File1) > File3

Bestimmt gibt es aber irgendein Tool, das sowas besser kann. Nur ich kenne keins.

Antworten |