rap*_*l75 4 command-line text-processing
是否有 linux 命令返回文件的最后 x %?我知道 tail 可以返回多行 (-n) 或字节数 (-c),但是如果我想获取文件的最后 25% 怎么办?有命令可以这样做吗?
dha*_*hag 15
GNU split 几乎可以满足您的要求;给定一个文本文件in.txt,这将按照字节数(不是行数)打印最后一个季度(4 个部分中的第 4 部分),而不拆分行:
split -n l/4/4 in.txt
Run Code Online (Sandbox Code Playgroud)
以下是 的相关文档split -n CHUNKS:
CHUNKS可能是:[...]l/K/N将 N 中的第 K 个输出到标准输出而不拆分行
在问题中作为示例提到的非常具体的情况下,
4/4请求输入文件的第四季度或最后 25%。对于不是输入的 1/n 的大小,我认为 split 不会提供如此简单的解决方案。
复杂的bash+ stat+ bc+tail的任何百分比的解决方案:
get_last_chunk () {
local p=$(bc <<<"scale=2; $1/100")
tail -c $(printf "%.0f" $(echo "$(stat -c%s $2) * $p" | bc)) "$2"
}
Run Code Online (Sandbox Code Playgroud)
$1和$2- 分别是函数的第一个和第二个参数p- 用百分比值作为浮点数分配的变量(例如0.14或0.55)stat -c%s $2 - 以字节为单位获取输入文件的实际大小tail -c N $2- 获取N文件的最后一个字节或者使用更简化的版本:
get_last_chunk () {
tail -c "$(($(stat -c%s - < "$2") * $1 / 100))" < "$2"))"
}
Run Code Online (Sandbox Code Playgroud)
签名:get_last_chunk <percent> <filename>
样品file.txt:
apples
oranges
bananas
cherries
Run Code Online (Sandbox Code Playgroud)
测试用例:
get_last_chunk 17 file.txt
ries
Run Code Online (Sandbox Code Playgroud)
get_last_chunk 77 file.txt
oranges
bananas
cherries
Run Code Online (Sandbox Code Playgroud)
get_last_chunk 29 file.txt
cherries
Run Code Online (Sandbox Code Playgroud)