如何用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
相关产品推荐
相关产品推荐

