如何用gawk单次打开多文件并原地删除最后n行?
用gawk原地删除多文件最后n行的办法
直接用这条gawk命令即可,无需依赖其他外部工具,能一次性处理多个文件,且仅遍历文件一遍,实现原地修改:
gawk -v n=3 -i inplace ' { buf[(NR%n)+1] = $0 if (NR > n) print buf[(NR-n)%n +1] } ENDFILE { if (NR <= n) { # 文件行数少于等于要删除的行数时,直接清空文件 close(FILENAME) printf "" > FILENAME } }' file1.txt file2.txt ...
具体运作逻辑
- 环形缓冲区暂存行:用一个大小为
n的数组缓存最近读取的n行,每读入新行就更新缓冲区;当读取行数超过n时,先输出缓冲区中最早存入的行(即需要保留的内容)。遍历结束后,缓冲区中剩余的就是最后n行,直接丢弃即可,无需重复读取文件。 - 原地编辑文件:
-i inplace是gawk内置扩展模块,会自动将处理后的内容写回原文件,省去手动创建临时文件再替换的步骤。 - 批量处理多文件:命令行末尾可传入任意多个目标文件,gawk会逐个处理;每个文件的行数统计独立,互不干扰。
参数调整说明
- 修改
-v n=3中的数字3,即可指定要删除的最后行数。 - 末尾的
file1.txt file2.txt ...可替换为实际需要处理的文件名,也支持用通配符(如*.txt)批量匹配文件。
内容的提问来源于stack exchange,提问作者user1424739
相关产品推荐
相关产品推荐

