【发布时间】: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 上运行;对于 GNUsed,扩展是可选的)。 -
至于为什么它对某些文件不起作用,最简单的解释可能是“文件不包含行”(例如,它们是可执行文件),或者“它们包含二进制数据"(ASCII NUL 字符把事情搞砸了),或者“它们包含的行太长了”(JSON — 我在看着你!)。