【发布时间】:2019-03-09 00:16:57
【问题描述】:
问题
在文件夹中,我想打印包含 n=27 行或更少行的每个 .txt 文件的名称。我可以的
wc -l *.txt | awk '{if ($1 <= 27){print}}'
问题是文件夹中的许多文件有数百万行(而且行很长),因此命令wc -l *.txt 非常慢。原则上,一个进程可以计算行数,直到找到至少n 行,然后继续处理下一个文件。
什么是更快的替代方案?
仅供参考,我在MAC OSX 10.11.6
尝试
这是awk的尝试
#!/bin/awk -f
function printPreviousFileIfNeeded(previousNbLines, previousFILENAME)
{
if (previousNbLines <= n)
{
print previousNbLines": "previousFILENAME
}
}
BEGIN{
previousNbLines=n+1
previousFILENAME=NA
}
{
if (FNR==1)
{
printPreviousFileIfNeeded(previousNbLines, previousFILENAME)
previousFILENAME=FILENAME
}
previousNbLines=FNR
if (FNR > n)
{
nextfile
}
}
END{
printPreviousFileIfNeeded(previousNbLines, previousFILENAME)
}
可以称为
awk -v n=27 -f myAwk.awk *.txt
但是,代码无法打印出完全空的文件。我不确定如何解决这个问题,也不确定我的 awk 脚本是否可行。
【问题讨论】:
-
head -n27 *txt |厕所-l | awk '{if ($1
-
@newbie 那也不会处理空文件。
-
它在 bash linux 上运行,它返回 0 ?头-n27 空.txt | wc -l 0
-
哦,对,但是你需要循环运行它,一次一个文件。
标签: bash performance shell file awk