从文件中提取特定行集合
我有很多大约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()
。然后数一下换行符的数量——你至少需要有两个换行符。如果换行符少于两个,就把你的猜测翻倍,再试一次。
把你读取的数据按换行符分开——你想要的那一行就是分开后倒数第二个项目。