![如何高效地删除 10000 个文件中的某些行](https://linux22.com/image/1492453/%E5%A6%82%E4%BD%95%E9%AB%98%E6%95%88%E5%9C%B0%E5%88%A0%E9%99%A4%2010000%20%E4%B8%AA%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E6%9F%90%E4%BA%9B%E8%A1%8C.png)
我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 {} \;