2015-05-14 95 views
-1

替換這些記錄,我有以下文件:如何搜索和使用awk

 %0 Book 
    %T Gale encyclopedia of medicine 
    %A Deirdre S. Blanchfield 
    %A Jacqueline L. Longe 
    %A Gale Research Company 
    %@ 0787654892 
    %D 2002 
    %I Gale Group 
    %R 10.1001/0787654892 
    %F Gale_Thomson_Encyclopedias/Medicine and Health/0787654892/Gale Encyclopedia of Medicine. Vol. 1. 2nd ed.pdf 

    %0 Book 
    %T Encyclopedia of United States national security 
    %A Richard J. Samuels 
    %@ 0761929274 
    %D 2006 
    %I SAGE 
    %R 10.1001/0761929274 
    %F Gale_Thomson_Encyclopedias/Politics, Law, Sociology/Encyclopedia of United States National Security_v1-2_0761929274 (Sage, 2006).pdf 

    %0 Book 
    %T Gale encyclopedia of medicine 
    %A Deirdre S. Blanchfield 
    %A Jacqueline L. Longe 
    %A Gale Research Company 
    %@ 0787654892 
    %D 2002 
    %I Gale Group 
    %R 10.1001/0787654892 
    %F Gale_Thomson_Encyclopedias/Medicine and Health/0787654892/Gale Encyclopedia of Medicine. Vol. 2. 2nd ed.pdf 

,願與下列順序文件名在%F文件中替換。

/ModDate(D: 

/Subject (??? 2015, :. doi:<content of field %R>')/ModDate(D: 
從上面的例子中

(顯示磺酰基的第一條記錄,而應針對所有記錄來完成):

文件名稱爲:

 Gale_Thomson_Encyclopedias/Medicine and Health/0787654892/Gale Encyclopedia of Medicine. Vol. 1. 2nd ed.pdf 

with follwing sequence:

 /ModDate(D: 

 /Subject (??? 2015, :. doi:10.1001/0787654892)/ModDate(D: 

怎麼可以這樣使用awk進行更換?非常感謝!如果該文件已經有一條/subject (..)行,則可能會出現問題。在更換完成之前應該刪除它。

任何幫助,歡迎。

+1

所以呢?你能向我們展示一個例子嗎?這也很好解釋你被困在哪裏,因爲目前看來你只是想讓別人爲你做你的工作。 –

+0

無記錄記錄位於具有此格式的一個文件中。每個記錄以'\ r \ n%0 Book'開頭。而且它們只是PDF文件的名稱。那麼我也想學習,所以我當然會做這個工作,但是我對awk並不是很熟悉,這是一個很棒的工具。目的是在PDF中定義DOI,它們在Endnote中被覆蓋,而元素是以Endnote Records格式導出​​。如果可以這樣做,那麼Endnote可以自動導入PDF並將PDF鏈接到Endnote-Metadata。 –

+1

_並且想要用%F_中的文件名替換文件,這表明對於您顯示的文件中的每個記錄,其他地方都有單獨的文件。 –

回答

0

我嘗試以下操作:和看起來不錯:如果我理解正確的話,也有其他的文件一大堆,其中有一個不同的格式

 #!/usr/bin/perl 

    use strict; 
    use warnings; 

    #my $mypdf = ""; 
    #my $mydoi = ""; 
    #my @rest; 
    #my @rest2; 
    my $pdfbuf; 
    my $doibuf; 

    while (<>) { 
     chomp; 

     #($mydoi, $mypdf) = m/^%R (.*)|^%F (.+)/g; 

     my ($mydoi, @rest) = m/^%R (.*)/g ; 
      #print '->' . $mydoi if ($mydoi); 
      $doibuf = $mydoi if ($mydoi); 

     my ($mypdf, @rest2) = m/^%F (.*)/g ; 
      #print '->' . $mypdf if ($mypdf); 
      $pdfbuf = $mypdf if ($mypdf); 


     #my ($mydoi, @rest2) = m/^%R (.*)/g; 


     if (($pdfbuf)&&($doibuf)) 
      { 

       #print "NOW: ",$doibuf,", and " ; 
       #print $pdfbuf, "\n" ; 
       $doibuf =~ s/\//\\\//g; 
       $pdfbuf =~ s/ //g; 
       my $subj =  '/Subject (??? 2015, :. doi:'.$doibuf.')' ; 
       my $search = '(/ModDate.D.*?\))'; 

       #my $cmd = 'awk -v add=\'' . $subj . '\' \'1; /' . $search . '/{print add}\' ./' . $pdfbuf . ' > ./' . $pdfbuf . '_withDOI' ; 
       my $cmd = ' perl -pe \'s|' . $search . '|\1' . $subj . '|\' ./' . $pdfbuf . ' > ./' . $pdfbuf . '_withDOI' ; 
       my $outputofshell = qx/$cmd/; 

       print $cmd, "\n" ; 
       $doibuf=""; $pdfbuf=""; 


      } 


    }