• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:外部ファイルを1行ずつ読み込んで特定カラムを引数として)

外部ファイルを読み込んで特定カラムで紐付ける方法

このQ&Aのポイント
  • 外部ファイルの特定のカラムを読み込んで、別の外部ファイルと紐付ける方法について考えています。
  • データベースを作成するほどのデータではないため、ファイルの行数を取得してawk/sedコマンドやPerlを使用して実装する予定です。
  • やりたいことは、sample1.logから1/2カラム目を取得して、sample2.logに対してsample1.logの2カラム目で紐付けてreport.logを出力することです。

質問者が選んだベストアンサー

  • ベストアンサー
  • shiren2
  • ベストアンサー率47% (139/295)
回答No.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)

回答No.1

スマートかどうかはわからないですが、作ってみました。 こんな感じでいかがですか? #!/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;

関連するQ&A

専門家に質問してみよう