【问题标题】:How to remove 10 % of the lines of a (large) file?如何删除(大)文件的 10% 行?
【发布时间】:2014-10-05 16:15:42
【问题描述】:

我有一些文件(一些 > 30)我想删除其前 10% 的行(从开头开始)。

在其他 Stack Overflow 用户的帮助下,我尝试做这样的事情:

declare -a t
declare -a z
for j in {0..31}; do
    t[$j]=$(wc -l  < h_$j)
    z[$j]=$(echo "${t[$i]}"/10 | bc)
    sed "1,${z[$j]}d" h_$j > hh_$j
done

但是对于某些文件,我不知道为什么,它不起作用。我虽然知道split,但我找不到任何选项允许我只删除前 10% 而不会生成 10 个不同文件和 10% 的原始文件。

【问题讨论】:

  • split 似乎是一个合理的方法:对于每个文件,计算 10%,split 在该边界处,删除第一个文件(例如 rm xaa),将其余文件重新组合在一起。
  • $i 应该是 $j,我猜。在您的示例中没有分配给 i 。
  • 请注意,您实际上不需要使用数组,除非您需要在循环之后知道在开始之前文件有多大。您可以简单地使用t=…z=…sed "1,${z}d" …(这里需要{},因为$zd 替换了不同的变量)。某些版本的sed 有一个-i 选项来覆盖原始版本;谨慎使用! (请注意,-i .bak 创建了一个备份,并且可以在 Linux 和 Mac OS X 上运行;对于 GNU sed,扩展是可选的)。
  • 至于为什么它对某些文件不起作用,最简单的解释可能是“文件不包含行”(例如,它们是可执行文件),或者“它们包含二进制数据"(ASCII NUL 字符把事情搞砸了),或者“它们包含的行太长了”(JSON — 我在看着你!)。

标签: bash sed split


【解决方案1】:

使用tail

这使用tailfile 中删除前10% 的行:

tail -n+$(( $(wc -l <file) / 10 )) file

使用sed

sed -n "$(( $(wc -l <file) / 10 ))",'$ p' file

如果要原地更改文件,请使用 sed 的 -i 选项:

sed -i -n "$(( $(wc -l <file) / 10 ))",'$ p' file

对于非 GNU sed(OSX 等),选项 -i 可能需要指定备份文件扩展名的参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 2023-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    相关资源
    最近更新 更多