Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 使用多个文件中的列数据进行Gnuplot打印_File_Gnuplot - Fatal编程技术网

File 使用多个文件中的列数据进行Gnuplot打印

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)

我有两个文件“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)
。我假设行数和x的值是相同的。你“仅仅”想要绘制
f(x)
g(x)
的对比图。但这与绘制f(g(x))不同(如您原来的问题)。在后一种情况下,可能需要插值

@Christoph已经指出了一个简单的解决方案,即使用awk合并文件。 如果您没有或不想使用awk,这里有一个有点麻烦的gnuplot专用解决方案

  • 将文件1:1加载到数据块(尽管仍未完全响应,请参见)
  • 删除行尾字符。这取决于操作系统。对于Windows,我必须将
    \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中有点麻烦。什么是列分隔符?空白比其他字符更容易,如
    等等…您可以假设我的列分隔符是(几个)空白。