awk多文件处理异常求助:仅处理首个文件问题排查
awk批量处理多文件仅处理首个文件的问题解决
问题场景
我编写了awk脚本solar.awk,单文件处理时可正常执行并输出结果:
awk -f solar.awk ./PerformanceData_2023-08-02_02-02-17/tmp_YdayData.txt > output.txt
但传入多个文件时仅处理首个文件,后续文件无输出。尝试用find批量查找子目录中的tmp_YdayData.txt并汇总结果,命令如下:
find . -type f -name 'tmp_YdayData.txt' -print0 | xargs -0 -t awk -f solar.awk >> output.txt
该命令能正确定位所有目标文件,但依旧只处理首个文件,即使将脚本简化为print $0问题仍存在。
错误原因
命令行参数传递逻辑错误:原命令中xargs与awk的参数组合方式,导致awk未正确接收并处理所有传入的文件,仅读取首个文件就终止处理。
解决方法
推荐两种可靠的批量处理方式:
方式一:使用find的-exec {} +语法(最优)
-exec {} +会将所有匹配的文件一次性传递给单个awk进程,既保证处理所有文件,又避免多进程启动的性能损耗:
find . -type f -name 'tmp_YdayData.txt' -exec awk -f solar.awk {} + >> output.txt
方式二:调整xargs的参数传递逻辑
若坚持使用xargs,可通过-I {}指定占位符,让xargs为每个文件单独调用一次awk(注:此方式会启动多个awk进程,适合小批量文件场景):
find . -type f -name 'tmp_YdayData.txt' -print0 | xargs -0 -I {} awk -f solar.awk {} >> output.txt
内容的提问来源于stack exchange,提问作者MaxG
相关产品推荐
相关产品推荐

