Gnuplot:合并数据文件并合并它们的列头

Gnuplot:合并数据文件并合并它们的列头,gnuplot,Gnuplot,我有两个带有列标题的数据文件,类似于: 数据文件1: A B 1 8 3 10 5 9 ... Vacuum log 10/26/2019 6:20:07 PM # Date Time CCGp IGPa IGPcl IGPco IGPf PIRbf PIRll PIRm PIRpv PPcl HT 0 10/26/2019 6:20:07 PM 99.020 261.070 16.300 10.7

我有两个带有列标题的数据文件,类似于:

数据文件1:

A B  
1 8  
3 10 
5 9  
...
Vacuum log  10/26/2019  6:20:07 PM
#   Date    Time    CCGp    IGPa    IGPcl   IGPco   IGPf    PIRbf   PIRll   PIRm    PIRpv   PPcl    HT
0   10/26/2019  6:20:07 PM  99.020  261.070 16.300  10.709  860.746 8.344   116.559e3   253.848 7.926   628.832e-3  0
1   10/26/2019  6:20:08 PM  101.305 261.613 16.908  10.012  862.001 8.399   116.535e3   256.132 7.726   677.712e-3  12
2   10/26/2019  6:20:09 PM  102.874 262.205 17.010  9.520   863.380 8.492   116.510e3   258.740 7.308   755.026e-3  102
...  
数据文件2:

A,C  
2,10  
4,15 
6,13  
...
现在我想将它们合并到一个表中,然后进行打印,如:

表:

A B C  
1 8  
3 10  
5 9  
2  10  
4  15  
6  13
我尝试了以下代码:

set table “C:/table.txt”
plot datafile1 u (stringcolumn(1)):(stringcolumn(2)) w table
plot datafile2 u (stringcolumn(1)):" ":(stringcolumn(2)) w table
unset table
plot “C:/table.txt” u 1:2 title columnhead, '' u 1:3 title columnhead
剩下的问题是,这段代码不会将列头放入结果表中

我想将数据文件合并到一个表中的原因是它们是格式完全不同的日志文件。 通过将多个文件合并到一个表中,同时使它们的日期列和时间列保持一致,我想在一个图中绘制其中的一些或所有列

以下是来自真实数据文件的两个示例: 随着时间的推移,这些日志文件中的每一个都可能增长到1GB

数据文件1:

A B  
1 8  
3 10 
5 9  
...
Vacuum log  10/26/2019  6:20:07 PM
#   Date    Time    CCGp    IGPa    IGPcl   IGPco   IGPf    PIRbf   PIRll   PIRm    PIRpv   PPcl    HT
0   10/26/2019  6:20:07 PM  99.020  261.070 16.300  10.709  860.746 8.344   116.559e3   253.848 7.926   628.832e-3  0
1   10/26/2019  6:20:08 PM  101.305 261.613 16.908  10.012  862.001 8.399   116.535e3   256.132 7.726   677.712e-3  12
2   10/26/2019  6:20:09 PM  102.874 262.205 17.010  9.520   863.380 8.492   116.510e3   258.740 7.308   755.026e-3  102
...  
数据文件2:

log     10/26/2019 8:47:17 PM
PC name     52334810

Date, Time, V-Acc, I-Acc[uA], V-Sup, V-Ext, I-Ext[uA], V-Fil, I-Fil[A], V-L1A, I-L1A[uA], V-L2, I-L2[uA], CIVi, IGPPressure[Pa], S.F.Internal, IGP4[Pa], PIVi
26/10/19, 18:20:06.484, 1.60, 0.000000, -0.12, 1.83, 0.054932, 2.033, 0.000381, 0.61, 52.000485, 0.00, 0.001373, 12, 0.0000407, Disabled???, 6
26/10/19, 18:20:07.468, 1.77, 2.003000, -3.62, 1.83, 1.623844, 2.629, 0.000382, 0.71, 51.638814, 0.00, 0.641373, 9, 0.0000407, Disabled???, 6
26/10/19, 18:07:07.878, 1.84, 12.000800, -5.17, 1.83, 3.051953, 2.385, 0.000381, 0.67, 49.071190, 0.00, 1.903325, 11, 0.0000407, Disabled???, 5
...
有人知道如何将数据和列头复制到示例中的表中吗


谢谢

正如我在评论中提到的,从您的最小示例来看,不清楚为什么需要合并两个数据文件而不是绘制两个数据文件。 我能想到的一个原因是,万一你们需要在列之间做一些数学运算。据我所知,在两个不同的文件中有两列是不容易做到这一点的

无论如何,如果您必须合并两个数据文件,您也可以通过外部程序进行合并。但是,如果您想要一个gnuplot唯一的解决方案,您可以像下面这样做。 假设您的数据已经在数据块中。请看这里: . 只需将数据块的数据行打印到新的数据块中,但必须删除最后一个字符,即换行符。有了这个,您实际上得到了4列A、B、A、C。如果您想删除额外的A列,这将是额外的工作

代码:

补充:操作后提供更多细节

好的,你的任务实际上有点复杂。当然,您可以使用externals软件来重新排列数据,但是您也可以只使用gnuplot做一些事情

以下代码的基本功能是: 选择列号mycl1和mycl2,这两个列将分别从$Data1和$Data2写入新的datablock$Data3。不同的日期/时间格式将更改为通用格式MyTimeFinder MT3

一些评论:

datafile1中的时间格式可能是有史以来最愚蠢的时间格式。虽然在gnuplot中有AM和PM的时间说明符%p,但我还没有成功地将12小时格式转换为24小时格式。所以,我定义了自己的公式。为了说明它的工作原理,我将您原来的一些时间改为上午12点和下午12点

datafile1还包含以开头的行中的标题,这是注释行的标准字符,因此将被忽略。将其更改为数据文件中未出现的任何字符,例如@

将包含标题的行绘制到虚拟表格中,同时将所需标题值分配给Header1和Header2

由于datafile1假设为空白,因此0 10/26/2019 6:20:07 AM 99.020实际上是5列。这就是后来在plot命令中使用strcolmycl1+1的原因

根据您的需要,跳过设置$Data。。。EOD部件,并将$Data1、$Data2、$Data3与您的文件名交换。使用gnuplot 5.2.6进行测试

代码:


从您的最小示例来看,我不清楚为什么需要合并两个文件而不是简单地打印两个文件:打印datafile1 u 1:2 ti columnhead,datafile2 u 1:2 ti columnhead?datafile1中的列分隔符是什么?固定列宽,带有多个空格或制表符\t?我正在测试您的脚本,以获得我想要组合的不同类型的日志文件,它运行得非常好,只需做一些小的更改。谢谢!一个小问题:在Datablock 2中,毫秒精度丢失,即使我使用时间说明符%H:%M:%.3S,所以:18:20:07.001 18:20:07.010 18:20:07.100所有结果都是:18:20:07有解决这个小问题的方法吗?Datafile1的列分隔符是TAB。您需要相应地设置输出格式,这里:myTimeFmt3=%d.%m.%Y%H:%m:%.3S然后应该可以了。
### merge columns from two files having different date/time formats
reset session

$Data1 <<EOD
Vacuum log  10/26/2019  6:20:07 PM
#   Date    Time    CCGp    IGPa    IGPcl   IGPco   IGPf    PIRbf   PIRll   PIRm    PIRpv   PPcl    HT
0   10/26/2019  6:20:07 AM  99.020  261.070 16.300  10.709  860.746 8.344   116.559e3   253.848 7.926   628.832e-3  0
1   10/26/2019 12:20:08 AM  101.305 261.613 16.908  10.012  862.001 8.399   116.535e3   256.132 7.726   677.712e-3  12
2   10/26/2019 12:20:09 PM  102.874 262.205 17.010  9.520   863.380 8.492   116.510e3   258.740 7.308   755.026e-3  102
EOD

$Data2 <<EOD
log     10/26/2019 8:47:17 PM
PC name     52334810

Date, Time, V-Acc, I-Acc[uA], V-Sup, V-Ext, I-Ext[uA], V-Fil, I-Fil[A], V-L1A, I-L1A[uA], V-L2, I-L2[uA], CIVi, IGPPressure[Pa], S.F.Internal, IGP4[Pa], PIVi
26/10/19, 18:20:06.484, 1.60, 0.000000, -0.12, 1.83, 0.054932, 2.033, 0.000381, 0.61, 52.000485, 0.00, 0.001373, 12, 0.0000407, Disabled???, 6
26/10/19, 18:20:07.468, 1.77, 2.003000, -3.62, 1.83, 1.623844, 2.629, 0.000382, 0.71, 51.638814, 0.00, 0.641373, 9, 0.0000407, Disabled???, 6
26/10/19, 18:07:07.878, 1.84, 12.000800, -5.17, 1.83, 3.051953, 2.385, 0.000381, 0.67, 49.071190, 0.00, 1.903325, 11, 0.0000407, Disabled???, 5
EOD


myTimeFmt1a = "%m/%d/%Y"               # 10/26/2019
myTimeFmt1b = "%H:%M:%S"               # 6:20:07   (12h am/pm)
myTimeFmt2  = "%d/%m/%y, %H:%M:%S"     # 26/10/19, 18:20:06.484
myTimeFmt3  = "%d.%m.%Y %H:%M:%S"      # 31.12.2019 23:59:59

# change 12h am/pm format to 24h format
myTime12to24(t,p) = t+12*3600*(floor(t/3600)<12 && p eq "PM" ? 1 : floor(t/3600)==12 && p eq "AM"  ? -1 : 0)

myCol1 = 4
myCol2 = 3
myColDate1 = 2
myColTime1 = 3
myColDate2 = 1
myColTime2 = 2

# extract Headers
set datafile commentschar "@"    # whatever character which does not occur in file
set table $Dummy
    set datafile separator whitespace
    plot $Data1 u (Header1=strcol(myCol1)) skip 1 every ::0::0 w table
    set datafile separator comma
    plot $Data2 u (Header2=strcol(myCol2)) skip 3 every ::0::0 w table
unset table

# write data to new table 
set table $Data3
    plot '+' u ('Date Time, '.Header1.', '.Header2) every ::0::0 w table

    set datafile separator whitespace
    plot $Data1 u (strftime(myTimeFmt3,(timecolumn(myColDate1,myTimeFmt1a)) + myTime12to24(timecolumn(myColTime1,myTimeFmt1b),strcol(myColTime1+1))).", ".strcol(myCol1+1).", NaN") skip 2 w table

    set datafile separator comma
    plot $Data2 u (strftime(myTimeFmt3,timecolumn(1,myTimeFmt2)).", NaN, ".strcol(myCol2)) skip 4 w table
unset table
print $Data3
### end of code
 Date Time, CCGp, V-Acc 
 26.10.2019 06:20:07, 99.020, NaN       
 26.10.2019 00:20:08, 101.305, NaN      
 26.10.2019 12:20:09, 102.874, NaN      
 26.10.2019 18:20:06, NaN, 1.60 
 26.10.2019 18:20:07, NaN, 1.77 
 26.10.2019 18:07:07, NaN, 1.84