두 개의 텍스트 파일을 비교하고 해당 ID와 관련된 일치하는 ID, sub_ids 및 타임스탬프를 인쇄합니다.

두 개의 텍스트 파일을 비교하고 해당 ID와 관련된 일치하는 ID, sub_ids 및 타임스탬프를 인쇄합니다.

나는 Perl에서 이 솔루션이 흥미롭다고 생각했습니다. 두 번째 파일에서 일치하는 열과 두 개의 추가 열(개정 ID n 릴리스 날짜)을 인쇄하려는 비슷한 상황이 있습니다. 이 코드에서 이 두 파일을 어떻게 읽을 수 있습니까? 나는 이 코드를 분석하고 해시와 배열에 대해 배울 계획입니다.

#!/usr/bin/perl

# create names lookup table from first file
  my %names;
  while (<>) {
  (my $col1)= split / /, $_;
  $names{$col1} = 1;
  last if eof;
  }

# scan second file
  while (<>) {
  print if /^(\S+).*/ && not $names{$1};
  }

 File 1:
 Name               IRR ID
 slic73p1hsicbxttop 99034438
 c73p1avrsrldo150top99034238
 c73p1avrfusevrmtop 99034201

 Example file 2
 Type Name              Rev ID   IRR ID   PP Group      Date Released  PP Category                              
 Comp c73p1avrfusevrmtop PROD_2_5 99034201 SEG RIP Reuse 5/3/2015 6:59   Hard   
 Comp c73p1avrfusevrmtop PROD_2_4 99034201 SEG RIP Reuse 4/23/2015 10:27 Hard   
 Comp c73p1avrfusevrmtop PROD_2_3 99034201 SEG RIP Reuse 3/17/2015 23:51 Hard   
 Comp c73p1avrfusevrmtop PROD_2_2 99034201 SEG RIP Reuse 2/1/2015 11:27  Hard   

 Expected Output: there are also other rows in the table which doesn't match
 IRR ID   Rev ID   Date Released (date to be printed in a chronological   order)
 99034201 PROD_2_5 5/3/2015 6:59    
 99034201 PROD_2_4 4/23/2015 10:27  
 99034201 PROD_2_3 3/17/2015 23:51  
 99034201 PROD_2_2 2/1/2015 11:27  

답변1

첫 번째 블록:

my %names;
while (<>) {
    ( my $col1 ) = split / /, $_;
    $names{$col1} = 1;
    last if eof;
}
  • 우리는 해시를 선언합니다 names.
  • 한 번에 한 줄씩 파일 핸들을 반복합니다. 이 파일 핸들은 <>Perl에서 특별한 의미를 갖습니다.누구나 STDIN또는 명령줄에 지정된 파일의 내용입니다. 이 코드는 후자의 경우에만 작동하는 것으로 보이며 이는 일반적으로 잘못된 형식입니다.
  • 각 루프 반복에서 $_현재 행으로 설정됩니다.
  • $_공백 에 split배열로 변환합니다.
  • my ( $col1 )는 배열입니다. 분할의 첫 번째 요소가 에 할당됩니다 $col1. (나머지는 할당을 사용할 수 있습니다 my ( $col1, $col2, @more_cols ) = ...)
  • $col1해시의 키는 names1로 설정됩니다.

예를 들어:

$VAR1 = {
          'c73p1avrsrldo150top' => 1,
          'c73p1avrfusevrmtop' => 1,
          'slic73p1hsicbxttop' => 1
        };

그런 다음 두 번째 파일부터 시작합니다.

  while (<>) {
      print if /^(\S+).*/ && not $names{$1};
  }

줄의 첫 번째 단어($1로 이동)를 "그냥" 캡처하는 잘못된 정규식으로 시작합니다. 그리고 만약에$names{$1} 아니요일단 설정되면 라인이 인쇄됩니다.

Comp입력 데이터가 주어지면 이것은 단순히 작동하지 않습니다. 존재하는지 확인하고 names있지 않기 때문입니다.

관련 정보