在Linux中获取多个文件的第N行

10
我需要完成的任务是,我有这样的文件:
test1.csv test2.csv test3.csv等等...
我想获取每个文件的第三行。目前,我可以使用awk或sed获取第三行,例如
echo | awk 'FNR == 3 { print; exit }' test1.csv >> last_file.csv 或使用sed或tail。
但是当我尝试在多个文件上执行此操作时,它无法获取行。我想这样做,
echo | awk 'FNR == 3 { print; exit }' test*.csv >> last_file.csv
我该如何实现?
谢谢。

你能提供一下输入和输出结果吗? - bkmoney
你的意思是,如果我尝试在多个文件上运行它,会输出什么? - mau5
4个回答

16

去除无用的echo,错误的exit和多余的print

awk 'FNR == 3' test*.csv

谢谢,这个更好。 - mau5
1
@mau5 这实际上效率较低,因为它处理整个文件,而nextfile命令允许我们在获取所需行后跳过到下一个文件。 - bkmoney
2
效率是需要在必要时才考虑的问题,没有必要一开始就通过性能优化使脚本变得不够简洁和不可移植,因为它几乎肯定可以像OP的真实文件一样轻松运行(当用户处理非常大的文件时,他们通常会告诉我们),如果性能确实成为问题,那么我们可以讨论选项和权衡。 - Ed Morton
1
谢谢您的建议,我很感激。对于我的任务,文件只包含3或4行。但是,如果有人有一个相当大的文件,我希望他们考虑使用“nextfile”作为答案。抱歉让您感到困惑,我应该在我的问题中提到这一点。 - mau5

3
这可能适用于您(GNU sed):
sed -sn 3p test*.csv >> last_file.csv

3

你应该使用

awk 'FNR == 3 { print; nextfile }' test*.csv >> last_file.csv

问题在于当你使用exit时,它会完全停止awk处理输入。而nextfile告诉awk停止处理当前文件并转到下一个文件。你使用的echo命令是不必要的。
了解更多信息请点击这里:http://www.gnu.org/software/gawk/manual/html_node/Nextfile-Statement.html

0
如果您想在所有文件和目录(包括子目录等)中执行此操作。
shopt -s globstar
awk 'FNR == 3' **/test*.csv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接