2

我正在尝试使用 awk 连续评估两个文件。在第一个文件的末尾,我正在读取一个日期,并将该日期用作评估第二个文件的输入。不幸的是,我在理解如何检测第一个文件的结尾读取日期并继续评估下一个文件时遇到了一些问题。我找到了一些答案,例如 FNR==NR,不幸的是,我无法正确实现它们。我通过硬编码行数来尝试穷人的解决方案。然而,这并不是一件非常聪明的事情。我仍然在处理第二个文件时遇到问题:

    BEGIN initalize the counters 



    {
    if(NR==FNR) <<<<<< this is needed to run properly, only NR==FNR fails, why ?!       
    {     
          # file_1      
          do -> from the last line of the first file extract a date 

          next << what is the meaning of this ??
    }                        

    {
          # file_2
          do -> read every line of the second file 
             and sum up the values form one of the colums


    }


    }


    END { divide the sum accumulated form file=2 
          by the time calculated form the last line of file=1}

# for calling the script use :
awk -f SCRIPT file_1 file_2

#example files
# file1 last line
version 1.5 code 11 mpi start /01/12/2014/ 18:33:12 end /01/12/2014/ 20:05:12

#file2

     1.28371E-05    0.2060    0.2060   -8   -8    0    0    0
     1.91616E-05    0.1927    0.1927   -7   -8    0    0    0
     1.27306E-05    0.1567    0.1567   -6   -8    0    0    0
     2.11623E-05    0.1523    0.1523   -5   -8    0    0    0
     1.67914E-05    0.1721    0.1721   -4   -8    0    0    0
     1.47247E-05    0.1851    0.1851   -3   -8    0    0    0
     1.32049E-05    0.1919    0.1919   -2   -8    0    0    0
     1.81256E-05    0.2130    0.2130   -1   -8    0    0    0
     2.63500E-05    0.1745    0.1745    0   -8    0    0    0
     1.99232E-05    0.1592    0.1592    1   -8    0    0    0
     2.08924E-05    0.1537    0.1537    2   -8    0    0    0
     2.44922E-05    0.1459    0.1459    3   -8    0    0    0
     2.53759E-05    0.1902    0.1902    4   -8    0    0    0
     2.30230E-05    0.1708    0.1708    5   -8    0    0    0
     2.10723E-05    0.1636    0.1636    6   -8    0    0    0
     1.86613E-05    0.1915    0.1915    7   -8    0    0    0
     2.05359E-05    0.1649    0.1649    8   -8    0    0    0
     1.09533E-05    0.1765    0.1765   -8   -7    0    0    0
     1.56917E-05    0.1740    0.1740   -7   -7    0    0    0
     1.52199E-05    0.2145    0.2145   -6   -7    0    0    0
     .....   

我会很感激任何帮助,提前谢谢你

亚历克斯

4

4 回答 4

1

我在命令行上设置变量来完成这个:

awk 'F==1 {print "one: ", $0} F==2 {print "two: ", $0}' F=1 one.txt F=2 two.txt

每当遇到 x=y 形式的东西时,它将 awk 中的变量 x 设置为 y。

于 2014-01-22T12:28:46.747 回答
1

如果您只想要第一个文件的最后一行的日期和第二个文件的内容供 awk 处理,您可以这样做并使生活更轻松:

(tail -1 firstfile; cat secondfile ) | awk 'something' -

当然,如果日期不是最后一行,你可以这样做:

(grep ^Date firstfile; cat secondfile ) | awk 'something' -

这样,您将只有一个“文件/流”要在 awk 中处理,第一行将是您的日期。

于 2014-01-22T15:03:24.203 回答
1

您可以通过以下几种方式做到这一点:

  • 缓冲每一行并检查何时FNR==1

就像是:

awk 'FNR==1 && NR!=1{print line,"is last in first file"}NR>1{print line}{line=$0} '
  • 如果您正在使用gawk,您可以使用该ENDFILE块。

或者:

gawk '{print $0} ENDFILE && !f {print $0,"is last line in first file", f=1}'
于 2014-01-22T11:07:56.593 回答
1

听起来您所需要的只是:

awk '
NR==FNR {
   do file1 stuff
   date = $0
   next
}
{
   do file2 stuff using the variable "date" which is set to the last line of file1
}
' file1 file2

如果这还不是您所需要的,请发布一些示例输入和预期输出,以帮助阐明您要执行的操作。

于 2014-01-22T15:52:11.803 回答