【问题标题】:How to search and replace these records with awk如何用 awk 搜索和替换这些记录
【发布时间】:2015-07-25 22:41:46
【问题描述】:

我有以下文件:

     %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

具有以下顺序:

      /ModDate(D:  

替换为

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

如何使用 awk 来完成?非常感谢!如果文件中已经有/subject ( .. ) 行,则可能会出现问题。这应该在替换完成之前删除。

欢迎任何帮助。

【问题讨论】:

  • 所以如果我理解正确的话,还有一大堆其他文件,它们有不同的格式?你能给我们举个例子吗?最好具体解释一下您在哪里卡住了,因为目前您似乎只是希望有人为您完成工作。
  • 没有所有记录在一个文件中采用这种格式。每条记录都以\r\n%0 Book 开头。并且只有 PDF 作为文件名。好吧,我也想学习,所以我当然会做,但我对 awk 不太熟悉,它是一个很棒的工具。目的是在 Endnote 中的 PDF 中定义 DOI,元数据是以尾注记录格式导出。如果可以做到这一点,那么 Endnote 可以自动导入 PDF 并将 PDF 链接到 Endnote 元数据。
  • and would like to replace in the file with the filename in %F 建议对于您显示的文件中的每条记录,其他地方都有一个单独的文件。跨度>
  • Yes TOM,在 %F 中有应处理的 PDF 的位置和文件名。 PDF中PDF的元数据是ASCII码,可以搜索替换。

标签: perl awk


【解决方案1】:

我尝试了以下:并且看起来不错:

     #!/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="";


            }


     }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-05
    • 2021-11-24
    • 1970-01-01
    相关资源
    最近更新 更多