带±限定符与换行字段的600MB管道分隔文件记录数统计问题
统计带换行字段的大文件记录数解决方案
针对你的问题——600MB平面文件用|分隔列、±做字段限定符,字段内含换行导致按行统计错误,以下是几种实用方法:
核心思路
不能按换行符\n分割记录,要识别完整记录的边界:每条记录以±开头,结尾为±|±±(对应最后一个空字段的限定符组合),或换行后紧跟±的是新记录的开始。
方法1:awk直接统计记录结束标记
利用每条记录末尾的±|±±特征,直接统计该字符串的出现次数:
awk '/±\|±±/{count++} END{print count}' 你的文件名
示例数据中该字符串正好出现7次,与实际记录数一致。
方法2:Python逐块读取统计(适合超大文件)
避免一次性加载600MB文件到内存,逐块读取并匹配记录结束标记:
def count_records(file_path): # 定义记录结束的字节模式(文本模式可改为字符串) record_end = b'±|±±\n' count = 0 # 每次读取1MB块,可根据内存调整 chunk_size = 1024 * 1024 with open(file_path, 'rb') as f: prev_chunk = b'' while True: chunk = f.read(chunk_size) if not chunk: # 处理最后一块剩余内容 count += (prev_chunk + chunk).count(record_end) break combined = prev_chunk + chunk count += combined.count(record_end) # 保留块末尾可能不完整的标记片段,防止跨块漏统计 prev_chunk = combined[-len(record_end)+1:] print(count) # 替换为你的文件路径 count_records('your_file.txt')
方法3:sed合并字段内换行后统计行数
先去掉字段内的换行(仅保留记录分隔的换行),再统计行数:
sed ':a;N;$!ba;s/\n\([^±]\)/\1/g' 你的文件名 | wc -l
解释::a;N;$!ba将整个文件读入缓冲区,s/\n\([^±]\)/\1/g把"换行+非±"的组合替换为非±字符,即去掉字段内的换行;最后wc -l统计处理后的行数,就是正确记录数。
注意:以上方法均假设字段内容不包含
±字符(因为它是字段限定符),如果字段内可能出现±,需要更复杂的解析逻辑。
内容的提问来源于stack exchange,提问作者VKS
相关产品推荐
相关产品推荐

