1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
my $in_file = "turtb_detached_train.ambig";
my $in_file2 = "test9STag.txt";
my $gold_standard = "GoldFormat.txt";
my @lines_file1 = ();
my %hash = ();
# einlesen der 1. Datei
open(R_FILEONE,"<$in_file") or die $!;
while(my $line = <R_FILEONE>){
push(@lines_file1,$line);
}
close R_FILEONE;
# einlesen der 2. Datei
open(R_FILETWO,"<$in_file2") or die $!;
while(my $line = <R_FILETWO>){
chomp $line;
$hash{$line} = 1;
}
close R_FILETWO;
# überprüfen, ob die Zeile aus der 1.Datei eine Zahl aus der 2. Datei enthält
foreach(@lines_file1){
my $check = substr($_,394,16); # Zahl in der langen Zeile raussuchen
if($hash{$check}){
$_ = '';
}
}
# Zieldatei schreiben
open(W_TARGET,">$gold_standard") or die $!;
foreach(@lines_file1){
print W_TARGET $_ if($_);
}
close W_TARGET;
1 2 3 4 5
open(my $fhtwo, "<",$in_file2) or die $!; while (my $line2 = <$fhtwo>) { ...; } close $fhtwo;
1 2 3 4
while (my $line2 = <$fhtwo>) { my ($key,@attributes) = split $line2; $hash{$key} = [@attributes]; }
1 2 3 4 5 6 7 8
while (my $line1 = <$fhone>) { my ($key,@attributes1) = split $line1; my $attrib_ref2 = $hash{key}; # Hash um Attribute die in File2 vorkamen aus der Attribut-Liste in File1 rauszufiltern my %filter_attrib = map {$_ => 1;} @$attrib_ref2; # Zeile mit Key, Attribute aus File2, gefilterte Attribute aus File1 ausgeben print $fhout join(' ',$key,@$attrib_ref2,grep {!$filter_attrib{$_}} @attributes1)."\n"; }
2013-08-13T19:48:23 FDXBekomme beide Dateien zum einen, aber irgendwie nimmt es nicht den ersten Attribut-aus Datei2 nach dem Wort (key) sondern ist wie in Datei1 aufgelistet.
1 2 3
while (my $line1 = <$fhone>) { chomp $line1; my ($key,@attributes1) = split /\s+/,$line1;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
#!/usr/bin/perl use strict; use warnings; my $in_file = "datei1.txt"; my $in_file2 = "datei2.txt"; my $gold_standard = "Ausgabe.txt"; open(my $fhone, "<",$in_file) or die $!; open(my $fhtwo, "<",$in_file2) or die $!; open(my $fhout, ">",$gold_standard) or die $!; my %hash = (); my @attributes1 = (); my @attributes2 = (); while (my $line2 = <$fhtwo>) { my ($key,@attributes2) = split (/\s+/,$line2); $hash{$key} = [@attributes2]; } close $fhtwo; while (my $line1 = <$fhone>) { chomp $line1; my ($key,@attributes1) = split (/\s+/,$line1); my $attrib_ref2 = $hash{key}; # Hash um Attribute die in File2 vorkamen aus der Attribut-Liste in File1 rauszufiltern my %filter_attrib = map {$_ => 1} @$attrib_ref2; # Zeile mit Key, Attribute aus File2, gefilterte Attribute aus File1 ausgeben print $fhout join(' ',$key,@$attrib_ref2,grep {!$filter_attrib{$_}} @attributes1)."\n"; } close $fhone; close $fhout;
2013-08-14T12:07:53 FDXFalls jetzt ATTR2.0 sich in der ersten Datei wiederholen sollte, kann man die Wiederholten ATTR auch irgendwie weglassen?
2013-08-14T20:06:42 LinuxerDann scheinen die Daten nicht dem gewünschten Format zu entsprechen.
Möglicherweise Leerzeichen vor dem ersten Wort einer Zeile?
1 2 3 4 5 6 7 8 9 10 11
$lineCount = 1; while (my $line1 = <$fhone>) { chomp $line1; my ($key,@attributes1) = split (/\s+|\t/,$line1); my $attrib_ref2 = $hash{$key.$lineCount}; # Hash um Attribute die in File2 vorkamen aus der Attribut-Liste in File1 rauszufiltern my %filter_attrib = map {$_ => 1}@$attrib_ref2; # Zeile mit Key, Attribute aus File2, gefilterte Attribute aus File1 ausgeben $lineCount++; print $fhout join(' ', $key, @$attrib_ref2, grep {!$filter_attrib{$_}} @attributes1)."\n"; }