You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用AWK自动获取文件总行数,实现前n-1行每行生成新文件

自动获取总行数并实现AWK分行生成文件的方案

这里有两种简洁的方法可以帮你自动获取目标文件的总行数,不用手动硬编码数字:

方法1:先通过wc统计行数再传给AWK

这是最通用且高效的方式,适合处理大文件:

# 先获取文件总行数(避免wc输出文件名)
total_lines=$(wc -l < export.ndjson)
# 将总行数作为变量传入AWK处理
awk -v total="$total_lines" 'NR < total {
    # 以当前行号作为新文件名
    output_file = NR ".ndjson"
    print >> output_file
    close(output_file)  # 关闭文件句柄,防止资源耗尽
}' export.ndjson

解释:

  • wc -l < export.ndjson 只会输出文件的总行数,不会附带文件名,比直接wc -l export.ndjson更方便后续变量赋值。
  • -v total="$total_lines" 把shell变量传入AWK,让AWK可以在处理时直接引用总行数。
  • NR < total 确保只处理除最后一行外的所有行,完美替代你原来硬编码的NR<8。

方法2:纯AWK实现(单进程两次扫描)

如果不想依赖外部命令wc,可以用AWK自己完成总行数统计和内容处理,适合需要单工具完成的场景:

awk '
# 第一次扫描:统计总行数并把每一行存到数组里
NR == FNR {
    lines[NR] = $0
    total = NR
    next
}
# 第二次扫描:处理除最后一行外的内容
FNR < total {
    output_file = FNR ".ndjson"
    print lines[FNR] > output_file
    close(output_file)
}' export.ndjson export.ndjson

解释:

  • 这里我们把目标文件在命令里写两次,AWK会把第一次读取的内容存到数组lines并记录总行数total,第二次读取时就可以直接使用这些数据。
  • 这种方法的缺点是如果文件非常大,会占用较多内存存储所有行内容,所以更适合中小体积的文件。

关键注意点:

一定要保留close(output_file)这一步!如果你的文件行数很多,AWK默认不会自动关闭打开的文件句柄,可能会触发系统的文件描述符上限,导致程序报错。

内容的提问来源于stack exchange,提问作者selestian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 22:02:45