File 使用多个文件中的列数据进行Gnuplot打印
我有两个文件“f.txt”和“g.txt”。两个文件中的数据都排列在两列中,列分隔符仅为几个空格。 第一列代表自变量“x”,第二列代表f(x)(或g(x))。File 使用多个文件中的列数据进行Gnuplot打印,file,gnuplot,File,Gnuplot,我有两个文件“f.txt”和“g.txt”。两个文件中的数据都排列在两列中,列分隔符仅为几个空格。 第一列代表自变量“x”,第二列代表f(x)(或g(x))。 绘制函数y=f(x)和y=g(x)很容易,但是有没有简单的方法来绘制f(x)和g(x)?当然,使用bash,我可以创建一个包含第一列g(x)和第二列f(x)的“中间”文件,然后正常打印该文件。但是,有没有一种方法可以在不实际创建此文件的情况下执行此操作?您的问题部分是矛盾的。看起来您有两个文件,每个文件有两列,即x,f(x)和x,g(x)
绘制函数y=f(x)和y=g(x)很容易,但是有没有简单的方法来绘制f(x)和g(x)?当然,使用bash,我可以创建一个包含第一列g(x)和第二列f(x)的“中间”文件,然后正常打印该文件。但是,有没有一种方法可以在不实际创建此文件的情况下执行此操作?您的问题部分是矛盾的。看起来您有两个文件,每个文件有两列,即
x,f(x)
和x,g(x)
。我假设行数和x的值是相同的。你“仅仅”想要绘制f(x)
与g(x)
的对比图。但这与绘制f(g(x))不同(如您原来的问题)。在后一种情况下,可能需要插值
@Christoph已经指出了一个简单的解决方案,即使用awk合并文件。
如果您没有或不想使用awk,这里有一个有点麻烦的gnuplot专用解决方案
\r
作为行尾字符(出于某种原因,不是\r\n
)。目前,我无法测试Linux和MacOS### merge two files (merging their lines)
# assumption: equal number of lines in each file
reset session
# load files 1:1 to datablocks
FILE1 = 'f.txt'
if (GPVAL_SYSNAME[:7] eq "Windows") { load '< echo $Data1 ^<^<EOD & type "'.FILE1.'"' }
else { load '< echo "\$Data1 << EOD" & cat "'.FILE1.'"' } # Linux & MacOS
FILE2 = 'g.txt'
if (GPVAL_SYSNAME[:7] eq "Windows") { load '< echo $Data2 ^<^<EOD & type "'.FILE2.'"' }
else { load '< echo "\$Data2 << EOD" & cat "'.FILE2.'"' } # Linux & MacOS
mySeparator = ","
myEOLc = sprintf("\r",0) # End of Line character Linux: "\n", Windows: "\r\n", Mac: "\r"
# function for removing EOL character(s) from a string
RemoveEOLc(s) = s[strlen(s)-strlen(myEOLc)+1:strlen(s)] eq myEOLc ? s[1:strlen(s)-strlen(myEOLc)] : s
set print $Data3
do for [i=1:|$Data1|] {
print sprintf("%s%s%s", RemoveEOLc($Data1[i]), mySeparator, RemoveEOLc($Data2[i]))
}
set print
print $Data3
### end of code
A,B,A,C
1,3,1,8
2,6,2,4
3,5,3,7
B C
3 8
6 4
5 7
f.txt
A,B
1,3
2,6
3,5
A,C
1,8
2,4
3,7
g.txt
A,B
1,3
2,6
3,5
A,C
1,8
2,4
3,7
代码:
### merge two files (merging their lines)
# assumption: equal number of lines in each file
reset session
# load files 1:1 to datablocks
FILE1 = 'f.txt'
if (GPVAL_SYSNAME[:7] eq "Windows") { load '< echo $Data1 ^<^<EOD & type "'.FILE1.'"' }
else { load '< echo "\$Data1 << EOD" & cat "'.FILE1.'"' } # Linux & MacOS
FILE2 = 'g.txt'
if (GPVAL_SYSNAME[:7] eq "Windows") { load '< echo $Data2 ^<^<EOD & type "'.FILE2.'"' }
else { load '< echo "\$Data2 << EOD" & cat "'.FILE2.'"' } # Linux & MacOS
mySeparator = ","
myEOLc = sprintf("\r",0) # End of Line character Linux: "\n", Windows: "\r\n", Mac: "\r"
# function for removing EOL character(s) from a string
RemoveEOLc(s) = s[strlen(s)-strlen(myEOLc)+1:strlen(s)] eq myEOLc ? s[1:strlen(s)-strlen(myEOLc)] : s
set print $Data3
do for [i=1:|$Data1|] {
print sprintf("%s%s%s", RemoveEOLc($Data1[i]), mySeparator, RemoveEOLc($Data2[i]))
}
set print
print $Data3
### end of code
A,B,A,C
1,3,1,8
2,6,2,4
3,5,3,7
B C
3 8
6 4
5 7
然后根据您的喜好绘制数据
添加:
### merge two files (merging their lines)
# assumption: equal number of lines in each file
reset session
# load files 1:1 to datablocks
FILE1 = 'f.txt'
if (GPVAL_SYSNAME[:7] eq "Windows") { load '< echo $Data1 ^<^<EOD & type "'.FILE1.'"' }
else { load '< echo "\$Data1 << EOD" & cat "'.FILE1.'"' } # Linux & MacOS
FILE2 = 'g.txt'
if (GPVAL_SYSNAME[:7] eq "Windows") { load '< echo $Data2 ^<^<EOD & type "'.FILE2.'"' }
else { load '< echo "\$Data2 << EOD" & cat "'.FILE2.'"' } # Linux & MacOS
mySeparator = ","
myEOLc = sprintf("\r",0) # End of Line character Linux: "\n", Windows: "\r\n", Mac: "\r"
# function for removing EOL character(s) from a string
RemoveEOLc(s) = s[strlen(s)-strlen(myEOLc)+1:strlen(s)] eq myEOLc ? s[1:strlen(s)-strlen(myEOLc)] : s
set print $Data3
do for [i=1:|$Data1|] {
print sprintf("%s%s%s", RemoveEOLc($Data1[i]), mySeparator, RemoveEOLc($Data2[i]))
}
set print
print $Data3
### end of code
A,B,A,C
1,3,1,8
2,6,2,4
3,5,3,7
B C
3 8
6 4
5 7
如果文件中有空格作为列分隔符,则可以使用word(“string”,n)
从$Data[i]
中提取“列”(请参阅帮助word
)。
然后您需要更改行:
mySeparator = " "
及
结果:
### merge two files (merging their lines)
# assumption: equal number of lines in each file
reset session
# load files 1:1 to datablocks
FILE1 = 'f.txt'
if (GPVAL_SYSNAME[:7] eq "Windows") { load '< echo $Data1 ^<^<EOD & type "'.FILE1.'"' }
else { load '< echo "\$Data1 << EOD" & cat "'.FILE1.'"' } # Linux & MacOS
FILE2 = 'g.txt'
if (GPVAL_SYSNAME[:7] eq "Windows") { load '< echo $Data2 ^<^<EOD & type "'.FILE2.'"' }
else { load '< echo "\$Data2 << EOD" & cat "'.FILE2.'"' } # Linux & MacOS
mySeparator = ","
myEOLc = sprintf("\r",0) # End of Line character Linux: "\n", Windows: "\r\n", Mac: "\r"
# function for removing EOL character(s) from a string
RemoveEOLc(s) = s[strlen(s)-strlen(myEOLc)+1:strlen(s)] eq myEOLc ? s[1:strlen(s)-strlen(myEOLc)] : s
set print $Data3
do for [i=1:|$Data1|] {
print sprintf("%s%s%s", RemoveEOLc($Data1[i]), mySeparator, RemoveEOLc($Data2[i]))
}
set print
print $Data3
### end of code
A,B,A,C
1,3,1,8
2,6,2,4
3,5,3,7
B C
3 8
6 4
5 7
您可以合并这些文件并将结果直接提供给gnuplot,而无需创建中间文件。谢谢!我确实没有准确地说出我想要什么,但你正确地理解了我的问题。抱歉,我太挑剔了,但是结果是否可能只有B行和C行,即没有(重复的)A行?也可能只有B行和C行,但是在gnuplot中有点麻烦。什么是列分隔符?空白比其他字符更容易,如
、
或代码>等等…您可以假设我的列分隔符是(几个)空白。