从文件中提取特定行集合

1 投票
4 回答
1925 浏览
提问于 2025-04-16 03:00

我有很多大约30MB的制表符分隔文本文件,里面的行宽度不一样。我想从第n行(这里n=4)和倒数第二行中提取第二个字段(最后一行是空的)。我可以用awk分别提取这些字段:

awk 'NR==4{print $2}' filename.dat

(我对这个不太理解,但)

awk '{y=x "\n" $2};END{print y}' filename.dat

有没有办法一次性提取这两个字段呢?我其实是想把这个过程放到一个Python脚本里,从很多(成千上万)不同文件夹中的文件里提取这些值,我希望能减少系统调用的次数。非常感谢!

补充:我知道可以用Python读取整个文件来提取这些值,但我觉得用awk可能更合适,因为这两个值都在大文件的末尾附近。

4 个回答

2

你可以把行数传递给awk:

awk -v lines=$( wc -l < filename.dat ) -v n=4 '
    NR == n || NR == lines-1 {print $2}
' filename.dat

注意,在wc这个命令中,使用<重定向可以避免文件名被打印出来。

3

在编程中,有时候我们会遇到一些问题,可能是因为代码写得不够好,或者是我们对某些概念理解得不够透彻。比如,有人可能在使用某个函数时,发现它的表现和预期不一样。这时候,我们就需要仔细检查代码,看看是不是哪里出错了。

此外,编程的世界里有很多工具和库可以帮助我们更方便地完成任务,但这些工具的使用也需要一定的学习和实践。对于初学者来说,理解这些工具的基本用法是非常重要的。

总之,编程就像解谜一样,需要耐心和细心。如果遇到困难,不妨多查阅资料,向他人请教,或者在社区中寻求帮助。

awk 'NR==4{print $2};{y=x "\n" $2};END{print y}' filename.dat
1

下面是如何在Python中实现这一点,而不需要读取整个文件

如果你想获取第n行,你必须从文件的开头读到第n行,因为每一行的长度是不一样的。

如果你想获取倒数第二行,你需要猜测这一行可能有多长(可以多猜一点),然后在文件末尾之前向前移动那么多字节。

从你移动到的位置开始read()。然后数一下换行符的数量——你至少需要有两个换行符。如果换行符少于两个,就把你的猜测翻倍,再试一次。

把你读取的数据按换行符分开——你想要的那一行就是分开后倒数第二个项目。

撰写回答