2016-07-26 3 views
0

ここにいくつかの例(大きなファイルのスニペット)を示します。最初のファイルの例では、file1がfile2より大きく、いくつかのタイムスタンプが一致していますが、いくつかは一致しません。目的の出力にはヘッダーが付きますが、あまりにも困難な場合は、後で入力することができます。 2番目のファイルの例ではfile1がfile2より小さいので、file2の行に最も一致するfile1の行を追加する必要があります(> =と<のロジック)。あなたが見ることができるように、秒単位の時間はファイルとサンプルの両方から異なります。したがって、いくつかは正確に一致しますが、いくつかは近いです。2つのcsvファイルの列1を比較し、最も近い一致を> = && <、次に印刷のペアを見つけて

私は簡単にすべての正確な時刻の一致を見つけることができますが、>と<の比較は見つかりません。

このコードは機能しますが、最初の行の多くは除外されています。 Iv'e
"Desired"の出力を提供するためにこのコードを再配置しましたが、
は成功しませんでした。

awk -F, ' 
BEGIN   {CNT+=2 
      } 
NR == FNR  {a[NR] = $0 
      b[NR] = $1 
      next 
      } 
$1 >= b[CNT] {CNT++ 
      } 
$1 < b[CNT] {print a[CNT-1] 
      print $0, RS 
      } 
' file1 file2 

ファイル1:

TIMEFORMATTED,G_TP01_OPER_ID,G_TP01_OPER_ID(RAW),G_TP02_PROC_NO,G_TP02_PROC_NO(R  
2016/05/25 16:25:19,0,0,0,NO_DEF,-2147483647 
2016/05/25 16:25:20,0,0,0,NO_DEF,-2147483648 
2016/05/25 16:25:21,0,0,0,NO_DEF,-2147483649 
2016/05/25 16:25:22,0,0,0,NO_DEF,-2147483650 
2016/05/25 16:25:23,0,0,0,NO_DEF,-2147483651 
2016/05/25 16:25:24,0,0,0,NO_DEF,-2147483652 
2016/05/25 16:25:25,0,0,0,NO_DEF,-2147483653 
2016/05/25 16:25:26,0,0,0,NO_DEF,-2147483654 
2016/05/25 16:25:27,0,0,0,NO_DEF,-2147483655 

ファイル2:

TIMEFORMATTED,HDR_SYNC,HDR_SEC,HDR_MSEC,G_CCSDS_VERSION,G_CCSDS_VERSION(RAW) 
2016/05/25 16:25:22,464374526,1464193527,206,0,0 
2016/05/25 16:25:26,464374526,1464193532,206,0,0 
2016/05/25 16:25:31,464374526,1464193537,207,0,0 

所望の出力:

TIMEFORMATTED,G_TP01_OPER_ID,G_TP01_OPER_ID(RAW),G_TP02_PROC_NO,G_TP02_PROC 
2016/05/25 16:25:22,0,0,0,NO_DEF,-2147483650 
TIMEFORMATTED,HDR_SYNC,HDR_SEC,HDR_MSEC,G_CCSDS_VERSION,G_CCSDS_VERSION(RAw 
2016/05/25 16:25:22,464374526,1464193527,206,0,0   
TIMEFORMATTED,G_TP01_OPER_ID,G_TP01_OPER_ID(RAW),G_TP02_PROC_NO,G_TP02_PROC 
2016/05/25 16:25:26,0,0,0,NO_DEF,-2147483654 
TIMEFORMATTED,HDR_SYNC,HDR_SEC,HDR_MSEC,G_CCSDS_VERSION,G_CCSDS_VERSION(RAw 
2016/05/25 16:25:26,464374526,1464193532,206,0,0  
TIMEFORMATTED,G_TP01_OPER_ID,G_TP01_OPER_ID(RAW),G_TP02_PROC_NO,G_TP02_PROC 
2016/05/25 16:25:27,0,0,0,NO_DEF,- 2147483655 
TIMEFORMATTED,HDR_SYNC,HDR_SEC,HDR_MSEC,G_CCSDS_VERSION,G_CCSDS_VERSION(RAW 
2016/05/25 16:25:31,464374526,1464193537,207,0,0 

第二の例:

ファイル1:

TIMEFORMATTED,G_TP01_OPER_ID,G_TP01_OPER_ID(RAW),G_TP02_PROC_NO,G_TP02_PROC_NO(R 
2014/04/07 16:00:30,0,0,0,NO_DEF,-2147483647 
2014/04/07 16:00:35,0,0,0,NO_DEF,-2147483648 
2014/04/07 16:00:40,0,0,0,NO_DEF,-2147483649 
2014/04/07 16:00:45,0,0,0,NO_DEF,-2147483650 
2014/04/07 16:00:50,0,0,0,NO_DEF,-2147483651 
2014/04/07 16:00:55,0,0,0,NO_DEF,-2147483652 
2014/04/07 16:00:60,0,0,0,NO_DEF,-2147483653 

ファイル2:

TIMEFORMATTED,CCSDS_VERSION,CCSDS_VERSION(RAW),CCSDS_TYPE,CCSDS_TYPE(RAW),CCSDS_2HDR_FLAG,CCSDS_2HDR_FLAG(RAW),ID 
2014/04/07 16:00:43,0,0,0,0,1,1,544 
2014/04/07 16:00:45,0,0,0,0,1,3,544 
2014/04/07 16:00:47,0,0,0,0,1,1,544 
2014/04/07 16:00:49,0,0,0,0,4,1,544 
2014/04/07 16:00:51,0,0,0,0,1,1,544 
2014/04/07 16:00:53,0,0,0,0,1,7,544 
2014/04/07 16:00:55,0,0,0,0,8,1,544 
2014/04/07 16:00:57,0,0,0,0,1,2,544 
2014/04/07 16:00:59,0,0,0,0,3,1,544 
2014/04/07 16:00:61,0,0,0,0,1,1,544 
2014/04/07 16:00:63,0,0,0,0,1,9,544 
2014/04/07 16:00:65,0,0,0,0,4,1,544 
2014/04/07 16:00:67,0,0,0,0,1,1,544 

出力:私はそれが簡単であれば、私はこれを取るよヘッダが第一の出力例のように装着することを好むが、

2014/04/07 16:00:40,0,0,0,NO_DEF,-2147483649 
2014/04/07 16:00:43,0,0,0,0,1,1,544 
2014/04/07 16:00:45,0,0,0,NO_DEF,-2147483650 
2014/04/07 16:00:45,0,0,0,0,1,3,544 
2014/04/07 16:00:45,0,0,0,NO_DEF,-2147483650 
2014/04/07 16:00:47,0,0,0,0,1,1,544 
2014/04/07 16:00:45,0,0,0,NO_DEF,-2147483650 
2014/04/07 16:00:49,0,0,0,0,4,1,544 
2014/04/07 16:00:50,0,0,0,NO_DEF,-2147483651 
2014/04/07 16:00:51,0,0,0,0,1,1,544 
2014/04/07 16:00:50,0,0,0,NO_DEF,-2147483651 
2014/04/07 16:00:53,0,0,0,0,1,7,544 
2014/04/07 16:00:55,0,0,0,NO_DEF,-2147483652 
2014/04/07 16:00:55,0,0,0,0,8,1,544 
2014/04/07 16:00:55,0,0,0,NO_DEF,-2147483652 
2014/04/07 16:00:57,0,0,0,0,1,2,544 
2014/04/07 16:00:55,0,0,0,NO_DEF,-2147483652 
2014/04/07 16:00:59,0,0,0,0,3,1,544 
2014/04/07 16:00:60,0,0,0,NO_DEF,-2147483653 
2014/04/07 16:00:61,0,0,0,0,1,1,544 
+0

出力ファイルが2行になっているのはなぜですか?レコードを1行にまとめてみませんか? –

+0

私は 'sort'を使って2つのファイルをマージし、最後に見た6列のレコードを7列のレコードの前に挿入する単純なperlスクリプトを作成します。次に、冗長な6列レコードを削除するための2回目のパス。それ以外の場合は、両方のファイルを同時に開く必要があります。 –

+0

応答マークありがとう。あなたの質問は分かりませんが、file1がfile2のメタデータに使用されているのでペアになっていますので、両方のファイルから最も近いタイムスタンプに一致させ、一致する(または最も近い)file1行をfile2の先頭に追加する必要があります行。私はそれらを別々のファイルに分割する必要があります。これらのファイルはちょっとしたスニペットなので、列の値は実際のものとは異なる場合があります。私は2つの実際のファイルを送信することができますが、それらは大きくなっています。再度、感謝します! –

答えて

0

ここにあります。私は1,をfile1に、そして2,をfile2に先行追加しました。私はそれらを再び分割することができます。これはスクリプトの最初の2行です。

次に、2つのファイルをタイムスタンプ(これはフィールド2になります)、つまり3行目にまとめてマージします。マージ操作は、ファイルが既にソートされていることを前提として非常に効率的です。最初のフィールドでもsort(minor)とします。filestampが同一であればfile1からfile2の前に来るようにしたいからです。

perlスクリプトがありません:$ 1 == "1" は、FILE1から最新の行を保存しますが、それを印刷しない場合

  1. $1に保存します)最初のフィールドを削除します。
  2. タイプ2の場合は、最新のタイプ "1"ライン($last)とタイプ2のラインが印刷されます。

a。shスクリプト:ここ

pa-dev00$ cat a.sh 
perl -pe 's/^/1,/' file1 > file1a 
perl -pe 's/^/2,/' file2 > file2a 
sort -m -t, -k2,2 -k1,1 file1a file2a | perl -ne 's/^(.),//; if ($1 == "1") {$last=$_; } else { print $last; print $_; }' 

は出力

pa-dev00$ ./a.sh 
2014/04/07 16:00:40,0,0,0,NO_DEF,-2147483649 
2014/04/07 16:00:43,0,0,0,0,1,1,544 
2014/04/07 16:00:45,0,0,0,NO_DEF,-2147483650 
2014/04/07 16:00:45,0,0,0,0,1,3,544 
2014/04/07 16:00:45,0,0,0,NO_DEF,-2147483650 
2014/04/07 16:00:47,0,0,0,0,1,1,544 
2014/04/07 16:00:45,0,0,0,NO_DEF,-2147483650 
2014/04/07 16:00:49,0,0,0,0,4,1,544 
2014/04/07 16:00:50,0,0,0,NO_DEF,-2147483651 
2014/04/07 16:00:51,0,0,0,0,1,1,544 
2014/04/07 16:00:50,0,0,0,NO_DEF,-2147483651 
2014/04/07 16:00:53,0,0,0,0,1,7,544 
2014/04/07 16:00:55,0,0,0,NO_DEF,-2147483652 
2014/04/07 16:00:55,0,0,0,0,8,1,544 
2014/04/07 16:00:55,0,0,0,NO_DEF,-2147483652 
2014/04/07 16:00:57,0,0,0,0,1,2,544 
2014/04/07 16:00:55,0,0,0,NO_DEF,-2147483652 
2014/04/07 16:00:59,0,0,0,0,3,1,544 
2014/04/07 16:00:60,0,0,0,NO_DEF,-2147483653 
2014/04/07 16:00:61,0,0,0,0,1,1,544 
2014/04/07 16:00:60,0,0,0,NO_DEF,-2147483653 
2014/04/07 16:00:63,0,0,0,0,1,9,544 
2014/04/07 16:00:60,0,0,0,NO_DEF,-2147483653 
2014/04/07 16:00:65,0,0,0,0,4,1,544 
2014/04/07 16:00:60,0,0,0,NO_DEF,-2147483653 
2014/04/07 16:00:67,0,0,0,0,1,1,544 

これはかなりくそ効率的であるべきです。各ステップは線形でなければならないので、ファイルのサイズに合わせて調整するだけです。

+0

ありがとう、私はこれを試してみます。私は実際のファイルで同じソートを使用していましたが、それはかなりうまくいっていましたが、もちろん、必要のない他のfile1行(file2データと一致しないメタデータ行)も保持しています。私はbashの前にperlを使っていないので、それがどうなるか見ていきます。 –

関連する問題