2016-12-21 21 views
0

ファイル1(ビッグファイル)の下に2つのファイルをマージします:特定の条件

A B C TIMESTAMP 
4 4 4 12344653380 
5 5 5 12344653401 
6 6 6 12344653411 
7 7 7 12344653433 
8 8 8 12344653460 
9 9 9 12344653466 

ファイル2(小さなファイル)(30秒ごとからのサンプル):

D E F TIMESTAMP 
1 1 1 12344653400 
2 2 2 12344653430 
3 3 3 12344653460 

ファイル3:

タイムスタンプがファイル2のTIMESTAMPの間隔にあるすべての行をマージする

A B C TIMESTAMP D E F 
5 5 5 12344653401 1 1 1 
6 6 6 12344653411 1 1 1 
7 7 7 12344653433 2 2 2 
8 8 8 12344653460 3 3 3 

私はこれらのような多くの答えを見つけましたHow to merge two files using AWK? 彼らは常にマッチに焦点を当てます。

+0

タイムスタンプはファイル2のTIMESTAMPの間隔と平均の間に何がありますか? –

+0

私がここでやろうとしているのは、ファイル2のTIMESTAMPの範囲とファイル1とのマージの間にあるすべてのタプルを取得することですが、ファイル1にタプルがあり、そのTIMESTAMP <= TIMESTAMPがfile2の場合それをfile3のままにします。 file1の次のタプルが> = file2の最初のTIMESTAMPで、<次のタプルである場合は、ファイル3にマージされて書き込まれます。 – gabriel32

答えて

0

この試してください(配列をソートしない場合、ファイルは タイムスタンプによってソートされたデータを持っていると仮定して)アレイに

  1. 読み出しファイル2を
  2. タイムスタンプによる読み出しファイル1(事前ソートそれ場合必要に応じて)1行ずつ。 ための各ライン、間隔で を落ちる行を見つけるために、アレイ上のバイナリ検索を行うと、ファイルからの行で見つかった行をマージ1
3

次の試してみて、このことができますなら、私に知らせてもらえ君は。

​​

上記の出力をfile3に取り込むことができます。上記awkコマンドの


説明:

awk 'FNR==NR && FNR>1{ 

FNRNRは、私たちはすべてのファイルの行数をお知らせしますので、NR変数の値がされる2のawkの組み込み変数です最後のファイルが読み取られるまで増加します。私たちが知っているように、awkは一度に複数のファイルを読み取ることができますが、NRとは異なり、新しいファイルが読み込まれるたびにFNRの値がリセットされます。私は条件FNR==NRを与えます。これは、最初のファイルが読み込まれるときにこの条件がTRUEになることを意味します。さらに、私はFNR>1を使用して、ファイル2の最初の行を読み取るべきでないことを確認します。タイミングの代わりにヘッダーがあるためです。したがって、これらの両方がTRUEの場合、次のアクションが実行されます。

MIN=MIN>$NF?NF:(MIN?MIN:$NF); 

MINの値が($は、フィールドの値を参照し、NFは、フィールドの数を指しawkの最後のフィールドであり、これは)$NFよりも大きい場合は条件がありますMINという名前の変数を作成します。この条件がTRUEの場合は、?の処理が実行され、MINの値は$NFに変更されます。その条件がNOT TRUEの場合、:の後の動作/条件が実行されます。したがって、ここでもまたMINNULLであるかどうかをチェックする条件があります。それで$NFに値を保持し、それ以外の場合はMINの値をそのままにしてください。

MAX=MAX>$NF?MAX:$NF; 

MAXという名前の変数を作成し、これをそのままMAXの値を維持することですTRUE、アクションの後?、であれば、MAX S値の値が$NFよりも大きい "かどうかをチェックするために条件を追加、実行されます。 FALSEの場合、:の後のアクションは、値を$NFに変更します。 sのカーソル文の先頭に移動しますawk「はさらにそうawkはすべて、次の文を残す意味ここにキーワードnextに建てs」を使用して

next} 

($NF>=MIN && $NF<=MAX) 

は、今、私たちはnext声明前述したように、これはそれがこの条件を実行することはできません、(FILE2という名前の最初のファイルが完全に読み込まれている場合にのみ実行される)状態を確認する必要があります。 $NFの値が変数MINの値以上で、MAXの値以下の場合はここでチェックし、現在の行を印刷します。ここには何も書き込まれません。 awkは条件/アクションで動作するため、条件がTRUEの場合は、特定のアクションを実行する必要があります。ここでは何も記述されていないので、現在の行を表示するデフォルトの動作が行われます。

' file2 file1 

ここで、file2とfile1という名前のInput_filesについて言及します。

+0

ようこそスタックオーバーフロー!これを素晴らしい答えにするには、それが何をしているのかを説明してください。そうすれば、1つのケースで機能するコピー/ペーストソリューションだけでなく、何が起こっているのか知ることができます。 – iblamefish

+0

こんにちはiblamefish、 ありがとうございます。いいえ、先生はコピー/ペーストの回答ではありません。私は説明をここに入れようとしていますが、チャンスはあまり許されていないと言っています。 – RavinderSingh13

+0

お返事ありがとうございます。残念ながら、私の必要なものはうまくいかなかったのです。 – gabriel32

関連する問題