如何高效一次性为制表符分隔文件追加多列数据?
嘿,这个批量给大文件追加多列的需求我熟!先给你把当前的sed命令改对,再聊聊大文件和变量读取的最优方案~
1. 快速修改现有命令,一次性追加三列
你之前用sed -i "s/.$/|2018-05-10/" $file是匹配行尾最后一个字符替换,其实更稳妥的是直接匹配行尾$,一次性把三列都加上——绝对不要分三次执行sed,那样每个50MB的文件要被读3次,IO开销直接翻3倍:
sed -i "s/$/|2018-05-10|2018-05-11|2018-05-12/" "$file"
这里给$file加引号是为了处理文件名带空格的情况,避免报错。另外,你示例输入里的2|Fals应该是2|False的笔误吧?不影响命令执行哈~
2. 从其他文件读取变量的场景
如果这三个日期不是固定值,而是要从其他文件读取,分两种常见情况:
情况A:每个目标文件对应一组固定的日期值
假设你有个配置文件file_dates.txt,每行格式是文件名|日期1|日期2|日期3,可以用循环读取配置,然后给对应文件追加:
while IFS='|' read -r filename d1 d2 d3; do sed -i "s/$/|$d1|$d2|$d3/" "$filename" done < file_dates.txt
情况B:每行的追加值不同(和目标文件行一一对应)
如果要给目标文件的每一行追加不同的三列值(比如另一个文件row_values.txt每行是d1|d2|d3),这时候用awk比sed更高效,因为awk可以直接关联两个文件的对应行:
# 假设row_values.txt每行是三个日期,和目标文件的行数完全一致 awk -F'|' 'NR==FNR {vals[NR]=$0; next} {print $0 "|" vals[NR]}' row_values.txt "$file" > temp_file && mv temp_file "$file"
这个命令会把两个文件的对应行合并,输出到临时文件后再替换原文件,避免中途失败损坏原文件。
3. 处理100个50MB文件的性能建议
- 一次性处理多列:刚才强调过,一次追加三列比三次快3倍,IO是大文件处理的核心瓶颈。
- 并行处理(可选):如果你的机器CPU核心足够,可以用
parallel命令批量并行处理文件,大幅缩短总耗时:
# 假设所有文件用同一组日期,先把追加字符串存成变量 DATE_SUFFIX="|2018-05-10|2018-05-11|2018-05-12" # 并行处理所有txt文件(根据你的实际文件后缀调整) parallel sed -i "s/$/$DATE_SUFFIX/" {} ::: *.txt
注意:并行操作前一定要备份原文件,避免操作出问题无法恢复。
内容的提问来源于stack exchange,提问作者cheapcoder
相关产品推荐
相关产品推荐

