将文件的特定列复制到C中的另一个文件

Mah*_*qui 5 c file-io gnuplot

我有两个文件,第一个看起来像这样

125 6.678
435 9.084
234 8.874
Run Code Online (Sandbox Code Playgroud)

等我的程序生成的大约2,048,000个条目.第二个文件是由gnuplot生成的文件,看起来有点像:

65 321456 985
78 98374  834
54 8493   848
Run Code Online (Sandbox Code Playgroud)

等约有2,048,000个参赛作品.

现在我需要做的是用3D中的gnuplot绘制第一个文件的第二列和第二个文件的两列.我认为第一个任务是将它们全部放入同一个文件中,我只想编写一个简单的c程序,快速读取这两个文件并将相关列放在一个文件中,但我不知道该怎么做.我知道如何复制文件的全部内容并使用ac程序将它们写入另一个文件 - 例如,为此,我有以下代码:

#include <stdio.h>
#include <stdlib.h>

int main (int argc, const char * argv[])
{
FILE *avalanche_size_BM;
FILE *avalanche_size_BM_2000;
char ch;


avalanche_size_BM = fopen("/Users/maheensiddiqui/Documents/MSc_Proj/avalanche_size_BM.dat","r");

if (avalanche_size_BM == NULL) 
{
    printf("I couldn't open.\n");
    exit(0);
}
avalanche_size_BM_2000 = fopen("/Users/maheensiddiqui/Desktop/avalanche_size_BM_2000.dat", "w");
if (avalanche_size_BM_2000 == NULL) 
{
    printf("I couldn't open.\n");
    exit(0);
}

printf("\n success!!");

while((ch=getc(avalanche_size_BM))!=EOF)
      putc(ch,avalanche_size_BM_2000);

fclose(avalanche_size_BM);
fclose(avalanche_size_BM_2000);



return(0);
}
Run Code Online (Sandbox Code Playgroud)

但是我怎么告诉它只读第一个文件中的第二列和第二个文件中的前两列并将它们(而不是所有列)复制到第三个文件,我可以用它来绘制我的三维图.

任何帮助都感激不尽!

谢谢

Ahm*_*sud 4

非 C 答案

这假设您只想要结果并且并不真正担心如何在 C 中做到这一点。

要使用简单的命令行工具生成文件,您可以使用pasteawk获取结果:

paste读取多个文件并将所有行组合在一起,并用制表符分隔

因此,如果您有两个文件(例如 foo.txt 和 bar.txt),其中包含以下内容:

foo.txt:

a1 b1 c1 
a2 b2 c2
Run Code Online (Sandbox Code Playgroud)

栏.txt:

d1 e1 f1
d2 e2 f2
Run Code Online (Sandbox Code Playgroud)

paste foo.txt bar.txt输出:

a1 b1 c1    d1 e1 f1
a2 b2 c2    d2 e2 f2
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用 awk 过滤出所需的列。

例如,如果您想要列 2、4 和 5(b1、d1、e1),您可以使用以下内容:

paste foo.txt bar.txt | awk '{ print $2 " " $4 " " $5 }'

我将假设这两个文件具有相同数量的条目 在 OSX 中从 Finder -> 实用程序启动命令 shell

在 shell 提示符下,您可以执行以下操作:

$ cd Desktop
$ paste avalanche_size_BM.dat avalanche_size_BM_2000.dat | \
    awk '{ print $2 " " $4 " " $5 }' > avalanche_size_3d.dat
Run Code Online (Sandbox Code Playgroud)

这将在 Desktop 子目录中从第一个文件的第 2 列和第二个文件的前两列创建一个名为 avalanche_size_3d.dat 的文件(因为它们粘贴在一起时最终位于位置 4 和 5)。

C-答案

这本质上就像编写一个小的粘贴实用程序

#include <stdio.h>
#include <stdlib.h>

int main()
{
     FILE *fp1 = fopen ("file1", "r");
     FILE *fp2 = fopen("file2", "r");
     FILE *out = fopen("fileout", "w");

     while (!feof(fp1) && !feof(fp2)) {
         char buf[256], col1[256], col2[256], col3[256];
         if ( fgets(buf, sizeof(buf), fp1) == 0 )
            break;
         sscanf(buf, "%s %s", col2, col1); /* we only need col1, col2 is reused later */
         if ( fgets(buf, sizeof(buf), fp2) == 0 ) 
            break;
         sscanf(buf, "%s %s", col2, col3); 
         fprintf(out, "%s %s %s\n", col1, col2, col3);
     }
     fclose(fp1);
     fclose(fp2);
     fclose(out);
}
Run Code Online (Sandbox Code Playgroud)

  • 仅使用`paste`就可以了,因为`gnuplot`本身能够选择特定的列:`splot "&lt; Paste file1 file2" using 2:3:4`。顺便说一句:目前正在开发“merge”命令,该命令应该直接在“gnuplot”中执行此操作。 (2认同)