Shell如何实现从文件中的第n行开始读取记录?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell如何实现从文件中的第n行开始读取记录?相关的知识,希望对你有一定的参考价值。

现有一个文件datafile.dat,里头可能有上百万行的数据记录。由于文件太大,不可能一次把所有内容都加载下来,所以只能对其逐行读取并处理。为提高执行速度,考虑对这个大数据文件进行并发处理,即让脚本1处理第1-10W行,脚本2处理第10W-20W行……脚本10处理第90W~100W行。

这就需要在脚本n中把文件的行指针自动预先指向第n万行的记录后才能开始读取。请问shell中有没有这个功能呢?谢谢!

可以用C来实现,当然,实现的方法还是跳过这些行,如下:

FILE *fp = fopen("datafile.dat", "r");
if(fp == NULL) 

    printf("open file error!\\n");
    exit(1);  
 
while(!foef(fp))

    static int line_count = 0;
    memset(lines, 0, sizeof(lines)); 
    line_count ++;//第一次就是第一行
    /* 取每行的内容 */ 
    if(!fgets(lines, fp, 1024)
        break; 
    /* 小于100000就继续下一行 */ 
    if( line_count < 100000 )
        continue; 

    if( line_count >= 200000 )
        break;//大于20万就退出该循环
    ///下面是处理的过程。

 

这个简短程序就实现了取第10万行到第20万行的数据。这10万和20万可以用参数带入,比如这个程序运行名是do_proc,那参数可以这么带:

do_proc 100000 200000

参考技术A tail -n -3 datafile.dat | head -n 30

从第3行开始取30行

sed -n '3,5p' datafile.dat

显示第3到5行

本回答被提问者采纳
参考技术B 好多命令都能实现,head, tail, sed, awk等,比如
awk 'NR > n' datafile.dat | (whaterver you want to do)
不过应该也是一行行读过去,丢掉(或者说不予处理)跳过的行

你要用文件指针,那估计你得自己写个程序了;实现你的功能不难,c程序,几十行足够

如何从 C++ 中的文本文件中逐行读取整数? [复制]

【中文标题】如何从 C++ 中的文本文件中逐行读取整数? [复制]【英文标题】:How to read integers line by line from a text file in c++? [duplicate] 【发布时间】:2020-02-24 20:10:58 【问题描述】:

所以我有一个关于图表的问题,我必须从输入文件中读取多个案例并检查适当性。每个案例在第一行有 n,它具有的节点数,在第二行有一个整数序列 x y,其中 (x, y) 是一条边。问题是我不知道我有多少边缘,所以我不知道从哪里停止阅读。

例子:

输入文件:

5

1 2 1 3 1 4 2 5 3 5 4 5

7

1 2 4 5 2 6

我在网上到处寻找解决方案,但找不到适合我的解决方案。我发现的大多数解决方案都只读取字符串。我试图找到并停在 '\n' 但那根本没有用。 Int('\n') 在我的计算机上是 10,所以它与我的边缘序列中的 10 混淆了。它甚至没有读取'\n'。

【问题讨论】:

您需要改进搜索技术。我上周回答了一个类似的问题。 提示:您不必告诉我们您在其他地方没有找到解决方案,如果您找到了,为什么还要在这里问?写“我在网上到处寻找解决方案,但找不到解决方案”并没有传达任何有用的信息,而是让我们怀疑您只是没有足够的搜索 你说得有道理 :)) 没想到那么远。 【参考方案1】:

这里有一个解决方案:

struct Edge

  int x;
  int y;
  friend std::istream& operator>>(std::istream& input, Edge& e);
;

std::istream& operator>>(std::istream& input, Edge& e)

  input >> e.x;
  input >> e.y;
  return input;

以下是一些主要代码:

int node_quantity = 0;
std::vector<Edge> database;
std::cin >> node_quantity;

// Ignore the newline following the number.
std::cin.ignore(1000, '\n');

// Start at the beginning of the line.
std::string text_line;
std::getline(std::cin, text_line);
// Read in the edges
std::istringstream text_stream(text_line);
Edge e;
while (text_stream >> e)

    database.push_back(e);

上面的代码创建了一个边缘结构并重载了operator&gt;&gt; 以读取边缘。

第二个代码片段读入一行边缘,并使用std::istringstream 读取文本行中的所有边缘。

【讨论】:

以上是关于Shell如何实现从文件中的第n行开始读取记录?的主要内容,如果未能解决你的问题,请参考以下文章

Linux:用shell如何实现读取一个字符串的第n个字符呢

shell中最强大,实用的命令awk

oc如何提取文件中的第n行第n个字符 比如: hello, boy, girl, i love

有没有办法从 IBM 大型机批处理程序中的第 10 条记录开始读取 ESDS 文件?

从文件中读取N行

java如何高效读取文本的第N行和最后N行?