Ich habe zwei Dateien:
>head(fileA)
2 1 544.8 1279.2 1.0603 3.2460 0.0542
3 1 546.2 1277.8 1.0463 3.2460 0.0553
3 2 543.9 1280.1 0.1652 3.2460 0.0177
4 1 543.7 1280.3 1.0819 3.2460 0.0527
>head(fileB)
1 Coly
2 Mony
3 Fong
4 Wow
5 Poly
Ich möchte die Namen in DateiB den Nummern in DateiA zuordnen, um folgende Ausgabe zu erhalten
2 Mony 1 Coly 544.8 1279.2 1.0603 3.2460 0.0542
3 Fong 1 Coly 546.2 1277.8 1.0463 3.2460 0.0553
3 Fong 2 Mony 543.9 1280.1 0.1652 3.2460 0.0177
4 Wow 1 Coly 543.7 1280.3 1.0819 3.2460 0.0527
Ehrlich gesagt konnte ich nichts ausprobieren, ich habe nur viel Zeit damit verbracht, nachzuschauen, wie das geht. Das Einzige, was mir einfiel, war, die Zahlen in Datei A Variablen zuzuweisen und dann jedes Mal, wenn diese Variablen gefunden werden, den Inhalt von Datei B daran anzuhängen. Leider weiß ich nicht, wie das geht.
Irgendwelche Vorschläge, Links, Anweisungen? Danke
Antwort1
Sie können die Befehle read, grep und tr von Bash verwenden:
cat fileA | while read i j k ; do
grep "^$i\W" fileB | tr '\n' ' '
grep "^$j\W" fileB | tr '\n' ' '
echo $k
done
Antwort2
Perl zur Rettung!
#! /usr/bin/perl
use warnings;
use strict;
open my $B, '<', 'B' or die $!;
my %name_of;
while (<$B>) {
my ($num, $name) = split;
$name_of{$num} = $name;
}
open my $A, '<', 'A' or die $!;
while (<$A>) {
my @F = split;
splice @F, 2, 0, $name_of{ $F[1] };
splice @F, 1, 0, $name_of{ $F[0] };
print "@F\n";
}
Der zweite Absatz liest die B-Datei in eine Hash-Tabelle und ordnet Zahlen Namen zu. Der dritte Absatz liest die A-Datei, teilt jede Zeile in ein Array auf, fügt die aus der Hash-Tabelle abgerufenen Namen gemäß den ersten beiden Spalten in das Array ein und druckt es aus.