如何从文本文件中提取数据?

Y. *_*uat 4 text command-line

文本文件如下:

  1. 分隔符:空格
  2. 表:3,496,080(行)x 6(列)
  3. 栏:年
  4. B栏:一年中的哪一天
  5. C栏:小时
  6. D 列:30、32.5、35、37.5、40 和 45 值之一
    • E 列的值以 25 开始,以 45 结束,五行后连续增加 5。
  7. E 列:25、30、35、40 和 45 个值之一
    • D 列的值以 30 开始,以 45 结束,在 499,440 行之后连续增加 2.5。
  8. F 列:值

    • A、B 和 C 列在 499,440 行后重新开始。
         1st row: 1998 152 1   30  25 12.5
   499,441st row: 1998 152 1  32.5 25 11.6
Run Code Online (Sandbox Code Playgroud)
1998 152 1 30 25 12.5
1998 152 1 30 30 12
1998 152 1 30 35 11.8
1998 152 1 30 40 11.9
1998 152 1 30 45 12
1998 152 3 30 25 10.9
1998 152 3 30 30 10.7
1998 152 3 30 35 10.6
1998 152 3 30 40 10.5
1998 152 3 30 45 10.4
1998 152 5 30 25 9.6
1998 152 5 30 30 9.5
1998 152 5 30 35 9.2
1998 152 5 30 40 9
1998 152 5 30 45 8.7
1998 152 7 30 25 8.4
1998 152 7 30 30 8.5
1998 152 7 30 35 8.9
1998 152 7 30 40 9.6
1998 152 7 30 45 10.7
1998 152 9 30 25 13.2
1998 152 9 30 30 14.3
1998 152 9 30 35 15.2
1998 152 9 30 40 15.9
1998 152 9 30 45 16.2
1998 152 11 30 25 16.2
1998 152 11 30 30 16.5
1998 152 11 30 35 16.8
1998 152 11 30 40 17.2
1998 152 11 30 45 17.9
1998 152 13 30 25 18
1998 152 13 30 30 18.6
1998 152 13 30 35 19.3
1998 152 13 30 40 20.1
1998 152 13 30 45 21.2
1998 152 15 30 25 20.4
1998 152 15 30 30 21.4
1998 152 15 30 35 22.5
1998 152 15 30 40 23.7
1998 152 15 30 45 25
1998 152 17 30 25 21.8
1998 152 17 30 30 23.2
1998 152 17 30 35 24.7
1998 152 17 30 40 26
1998 152 17 30 45 26.9
1998 152 19 30 25 22.4
1998 152 19 30 30 23.4
1998 152 19 30 35 24.3
1998 152 19 30 40 25
1998 152 19 30 45 25.6
1998 152 21 30 25 25.1
1998 152 21 30 30 25
1998 152 21 30 35 24.3
1998 152 21 30 40 23.3
1998 152 21 30 45 22
1998 152 23 30 25 20.9
1998 152 23 30 30 19
1998 152 23 30 35 17.2
1998 152 23 30 40 15.7
1998 152 23 30 45 14.5
Run Code Online (Sandbox Code Playgroud)

我想提取所有行,然后将数据写入文本文件,即 D= 30 和 E=25 和 B>=152 和 B<=241。

fid=fopen('table.txt','r');
formats='%f';
RawData=fscanf(fid,formats);

fclose(fid);

L=length(RawData);

fileID=fopen('test.txt','w');
Run Code Online (Sandbox Code Playgroud)

我试过的

我尝试使用 Matlab,使用下面的代码,但速度很慢:

for i=1:L/6

    data(i,:)=RawData((i-1)*6+1:(i-1)*6+6)';


    if data(i,4)==30
        if data(i,5)==25
            if data(i,2)>=152 && data(i,2)<=241
                    fprintf(fileID,'%d %d %d %d %d %3.1f \n',data(i,:));
             end
          end
     end


end
Run Code Online (Sandbox Code Playgroud)

ste*_*ver 7

我想提取所有行,然后将数据写入文本文件,即 D= 30 和 E=25 和 B>=152 和 B<=241。

这在 awk 中应该很简单

awk '$4==30 && $5==25 && $2>151 && $2<242' file > newfile
Run Code Online (Sandbox Code Playgroud)

默认的输入和输出字段分隔符是空格。

  • @Y.Suat,如果您不知道需要将“151”更改为“152”,那么您甚至无法尝试了解 awk 代码的实际作用。学习过程不是盲目地剪切和粘贴罐头配方。 (4认同)