wc -l orders.csv
tail -c 1 orders.csv | od -An -c
awk 'END{print NR}' orders.csv
对账文件有 12000 行,wc -l 出来是 11999,最后一条订单号没被处理。tail -1 能看到内容,程序按行读却少一条。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,wc -l 数的是换行符个数,最后一行没写 \n 就不计数。按 \n 切分的自写解析同样会丢,文本模式迭代反而不会,两种读法结果对不上。
这次卡住的地方就在「wc -l 末行」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。改完隔一天再看一次,当场正常不代表能稳住。
测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。
处理上按这个顺序:生成文件时保证每行都以 \n 结尾 包括最后一行;校验环节用 wc -l 加 tail -c1 判断末尾字符;读文件统一用 for line in f 不要自己 split;对账前先跑一次行数比对 不一致就拒绝入库。
改完只确认一件事:wc -l 和 awk 的 NR 数值一致 最后一条订单出现在结果里。
