获取文件的百分比

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 不会提供如此简单的解决方案。


Rom*_*est 6

复杂的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.140.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)