- ベストアンサー
外部ファイルを読み込んで特定カラムで紐付ける方法
- 外部ファイルの特定のカラムを読み込んで、別の外部ファイルと紐付ける方法について考えています。
- データベースを作成するほどのデータではないため、ファイルの行数を取得してawk/sedコマンドやPerlを使用して実装する予定です。
- やりたいことは、sample1.logから1/2カラム目を取得して、sample2.logに対してsample1.logの2カラム目で紐付けてreport.logを出力することです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
二つ目をハッシュに読み込んだ後、一つ目を逐次処理すればスマートではないでしょうか。 report.logにリダイレクトしてください。 インデントは全角スペースになっています。 #!/usr/bin/perl use strict; # AAAA => ABC my %hash = map{ chomp; split / /; } &fin("sample2.log"); # 0001 => AAAA for(&fin("sample1.log")){ chomp; my($num, $key) = split / /; if(exists $hash{$key}){ # 0001 AAAA ABC printf("%s %s %s\n", $num, $key, $hash{$key}); }else{ die "ERROR: $num $key"; } } sub fin { open(IN, shift) or die; return (<IN>); }
その他の回答 (1)
- toraneko75
- ベストアンサー率51% (27/52)
スマートかどうかはわからないですが、作ってみました。 こんな感じでいかがですか? #!/usr/bin/perl use strict; use warnings; my ( @sample1, @sample2, @report ); my $file1 = 'sample1.log'; open my $fh1, '<', "$file1" or die $!; chomp( @sample1 = <$fh1> ); close $fh1; my $file2 = 'sample2.log'; open my $fh2, '<', "$file2" or die $!; chomp( @sample2 = <$fh2> ); close $fh2; foreach my $line1 (@sample1) { my ( $num1, $key1 ) = ( split / /, $line1 ); foreach my $line2 (@sample2) { my ( $key2, $value ) = ( split / /, $line2 ); if ( $key1 eq $key2 ) { $value = "$num1 $key1 $value"; push @report, $value; } } } my $file = 'report.log'; open my $fh, '>', "$file" or die $!; for my $line (@report) { print $fh "$line\n"; } close $fh; exit;