使用AWK连续处理两个不同的文件

时间:2014-01-22 10:57:14

标签: awk end-of-life

我试图用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 个答案:

答案 0 :(得分: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}'

答案 1 :(得分: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。

答案 2 :(得分:1)

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

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

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

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

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

答案 3 :(得分: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

如果这不是你所需要的,请发布一些样本输入和预期输出,以帮助澄清你想要做的事情。