2

awk で 2 つのファイルを連続して評価しようとしています。最初のファイルの最後で日付を読み取り、その日付を 2 番目のファイルの評価の入力として使用します。残念ながら、最初のファイルの終わりを検出して日付を読み取り、次のファイルの評価を続行する方法を理解するのに問題があります。FNR==NR などの回答が見つかりましたが、残念ながら正しく実装できません。行数をハードコーディングすることで、貧乏人の解決策を試しました。ただし、これはそれほど賢明なことではありません。ただし、2番目のファイルの処理にはまだ問題があります。

    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 '
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 に答える
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 '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 に答える