2016-07-26 118 views
0

以下是一些示例(大型文件的片段)。第一個文件示例的file1大於file2,一些時間戳匹配,而另一些則不匹配。所需的輸出將包含標題,但如果太困難,我可以稍後再放入。第二個文件示例的file1小於file2,所以我需要附加與file2行最匹配的file1行(使用> =和<邏輯)。正如你所看到的,秒數隨時間而變化,所以一些人會精確匹配而另一些人靠近。比較兩個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

爲什麼你的輸出文件是成對的行?爲什麼不將記錄加入一行? –

+0

我會使用'sort'將兩個文件合併在一起,然後編寫一個簡單的perl腳本,它將在任何7列記錄之前插入最後看到的6列記錄。然後第二遍刪除多餘的6列記錄。否則,你必須同時打開這兩個文件。 –

+0

感謝Mark的迴應。我不確定我是否理解你的問題,但是它們是成對的,因爲file1用於file2的元數據,所以我必須匹配兩個文件中最接近的時間戳,並將匹配的(或最接近的)file1行附加到文件2的頂部行。然後我需要將它們分成他們自己的單獨文件。這些文件只是小片段,所以列中的值可能不是真實的。我可以發送兩個真實的文件,但它們很大。再次感謝! –

回答

0

好的,就在這裏。我在文件1前加了一個1,,將一個2,加到了文件2中,這樣我就可以再次將它們分開。這是腳本的前兩行。

然後將兩個文件合併到時間戳(現在是字段2),第3行。假設文件已經排序,合併操作非常高效。我還對第一個字段進行排序(次要),因爲如果文件標記相同,我們希望file1的行位於file2之前。

perl腳本的作用:

  1. 刪除第一個字段(它保存到$1
  2. 如果$ 1 == 「1」,並將從文件1的最近路線,但並不打印。
  3. 當它看到類型「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,所以我會看看那是怎麼回事。 –

相關問題