如何高效地删除 10000 个文件中的某些行

如何高效地删除 10000 个文件中的某些行

10000目录中有文件。我想删除行,以便保留文件头中的 2 行、文件尾中的 2 行以及中间的每 100 行。

例如:

#header1
#header2
0     x y
1     x y
...
100   x y
101   x y
...
80000 x y
#tail1
#tail2

应该成为

#header1
#header2
0     x y
100   x y
200   x y
...
80000 x y
#tail1
#tail2

最有效和最简单的方法是什么?我有大约 20 个目录,其中包含 10000 个长度不等的文件,我必须截断它们。

答案1

正如评论所说,awk 是此任务的不错选择。如果这是一次性任务,我只需创建一个基于 awk 的脚本,该脚本从其参数中获取的完整文件写入缩小的文件,然后从 find ... -exec ... 命令中调用它即可。例如

cat $HOME/bin/shrinkit.sh
#!/bin/sh

awk '/^#/ && headcnt<2  {print; ++headcnt}; $1~/^[0-9]+$/ { if(!(cnt%100)) {print}; ++cnt}; cnt && /^#/ && tailcnt<2  {print; ++tailcnt}' "$1" >"$1.tmp"  && mv "$1.tmp" "$1"


cd $workdir
find . -type f -exec $HOME/bin/shrinkit.sh {} \;

相关内容