Katzendatei1
foo
ice
two
Katzendatei2
bar
cream
hundred
Gewünschte Ausgabe:
foobar
icecream
twohundred
Datei1 und Datei2 haben in meinem Szenario immer die gleiche Anzahl von Zeilen, falls dies die Sache einfacher macht.
Katzendatei1
foo
ice
two
Katzendatei2
bar
cream
hundred
Gewünschte Ausgabe:
foobar
icecream
twohundred
Datei1 und Datei2 haben in meinem Szenario immer die gleiche Anzahl von Zeilen, falls dies die Sache einfacher macht.
Antworten:
Das richtige Werkzeug für diesen Job ist wahrscheinlich paste
paste -d '' file1 file2
Siehe man paste
für weitere Einzelheiten.
Sie können auch den folgenden pr
Befehl verwenden:
pr -TmJS"" file1 file2
woher
-T
Deaktiviert die Paginierung-mJ
m erge Dateien, J oining volle Linien-S""
Trennen Sie die Spalten mit einem leeren String Wenn Sie es wirklich mit einer reinen Bash-Shell machen wollten (nicht empfohlen), dann ist dies das, was ich vorschlagen würde:
while IFS= read -u3 -r a && IFS= read -u4 -r b; do
printf '%s%s\n' "$a" "$b"
done 3<file1 4<file2
(Dies nur, weil das Thema in Kommentaren zu einer anderen vorgeschlagenen Pure-Bash-Lösung auftauchte.)
Durch awk weg:
awk '{getline x<"file2"; print $0x}' file1
getline x<"file2"
Liest die gesamte Zeile aus Datei2 und speichert sie in der Variable x .print $0x
druckt die gesamte Zeile aus Datei1 aus, wobei $0
dann x
die gespeicherte Zeile von Datei2 verwendet wird .paste
ist der Weg zu gehen . Wenn Sie andere Methoden überprüfen möchten, finden Sie hier eine python
Lösung:
#!/usr/bin/env python2
import itertools
with open('/path/to/file1') as f1, open('/path/to/file2') as f2:
lines = itertools.izip_longest(f1, f2)
for a, b in lines:
if a and b:
print a.rstrip() + b.rstrip()
else:
if a:
print a.rstrip()
else:
print b.rstrip()
Wenn Sie nur wenige Zeilen haben:
#!/usr/bin/env python2
with open('/path/to/file1') as f1, open('/path/to/file2') as f2:
print '\n'.join((a.rstrip() + b.rstrip() for a, b in zip(f1, f2)))
Beachten Sie, dass bei einer ungleichen Anzahl von Zeilen diese an der letzten Zeile der Datei endet, die zuerst endet.
Auch mit pure bash
(beachte, dass dies leere Zeilen völlig ignoriert):
#!/bin/bash
IFS=$'\n' GLOBIGNORE='*'
f1=($(< file1))
f2=($(< file2))
i=0
while [ "${f1[${i}]}" ] && [ "${f2[${i}]}" ]
do
echo "${f1[${i}]}${f2[${i}]}" >> out
((i++))
done
while [ "${f1[${i}]}" ]
do
echo "${f1[${i}]}" >> out
((i++))
done
while [ "${f2[${i}]}" ]
do
echo "${f2[${i}]}" >> out
((i++))
done
mapfile
, um die Dateien in Arrays einzulesen, oder verwenden Sie eine while-Schleife mit zwei read
Befehlen, die von jedem ihrer Felder lesen.
array=( $(cmd) )
oder verwenden array=( $var )
. Verwenden Sie mapfile
stattdessen.
Der Perl-Weg, leicht zu verstehen:
#!/usr/bin/perl
$filename1=$ARGV[0];
$filename2=$ARGV[1];
open(my $fh1, "<", $filename1) or die "cannot open < $filename1: $!";
open(my $fh2, "<", $filename2) or die "cannot open < $filename2: $!";
my @array1;
my @array2;
while (my $line = <$fh1>) {
chomp $line;
push @array1, $line;
}
while (my $line = <$fh2>) {
chomp $line;
push @array2, $line;
}
for my $i (0 .. $#array1) {
print @array1[$i].@array2[$i]."\n";
}
Beginnen mit:
./merge file1 file2
Ausgabe:
foobar
icecream
twohundred