2016-07-26 28 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,所以我会看看那是怎么回事。 –

相关问题