从 zcat 命令中提取文件输出的最后 n 个百分比



我正在尝试提取来自 zcat 命令的文件输出的最后 2%。我尝试了一些事情

numlines=$(zcat file.tar.gz | wc -l)
zcat file.tar.gz | tail -n + $numlines*(98/100)

但是这种方法的问题是我的文件太大了,我负担不起两次运行 zcat 命令。有没有办法通过管道来做到这一点 行数 ,或其他一些方法。

编辑:zcat file.tar.gz | tar -xO | dd 2>&1 | tail -n 1的输出为

复制16942224047字节(17 GB,16 GiB(,109.154 秒,155 MB/秒

任何帮助将不胜感激。

将内容读取到变量。我假设有足够的内存可用。

content=$(zcat file.tar.gz| tar -xO)
lines=$(wc -l <<<"$content")
ninetyeight=$((100-$lines/100*98))
tail -n $ninetyeight

这仅在文件包含至少 100 行时才有效。

以下 awk 程序只会将文件的最后n% 保留到内存中。百分比是按地板计算的,也就是说,如果我们文件的n%代表134.56行,它将打印134行

awk -v n=2 '{a[FNR]=$0; min=FNR-int(FNR*n/100)}
{i=min; while(i in a) delete a[i--]}
END{for(i=min+1;i<=FNR;++i) print a[i]}' - < <(zcat file)

您可以在将zcat file替换为seq 100时验证这一点

最新更新