使用Awk按表头拆分文件并以表头信息命名输出文件
使用Awk按表头生成命名文件的解决方案
我来帮你搞定这个需求!根据你给出的原始数据格式,我们可以用Awk轻松完成提取日期、生成对应命名文件并写入内容的操作。
完整命令
假设你的原始文件名为input.txt,直接运行以下命令就能实现目标:
awk '{ if ($0 ~ /^AAABBB[0-9]{8}/) { # 从表头行提取日期:跳过前面6个字符的"AAABBB",取后面8位日期 date_str = substr($0, 7, 8) # 拼接出目标文件名 target_file = "file-" date_str # 提取表头行中日期之后的内容(跳过前14个字符:6位前缀+8位日期) line_content = substr($0, 15) } else { # 如果遇到同日期的后续行,把内容追加进去(兼容多行内容的情况) line_content = line_content " " $0 } # 将内容写入对应文件 print line_content > target_file }' input.txt
代码细节拆解
- 识别表头行:用正则
/^AAABBB[0-9]{8}/精准匹配以AAABBB开头、后跟8位日期的行,这就是每个数据分组的起始标识。 - 提取日期:
substr($0,7,8)从第7个字符开始截取8位,刚好拿到你需要的日期字符串(比如示例里的12042018)。 - 生成文件名:直接拼接成
file-日期的格式,完全符合你的命名要求。 - 提取并拼接内容:对于表头行,跳过前14个字符(
AAABBB+8位日期)得到后续内容;如果是同一日期的多行数据,会自动把新行内容追加到已有内容后。 - 写入文件:用
print line_content > target_file把内容写入对应文件,自动创建文件并覆盖旧内容(如果需要追加可以用>>,不过你的场景用>更合适)。
针对你的示例测试
如果你的原始文件内容是:
AAABBB12042018 Jon238444kdhsljdjd7 Math37378338kdjdkske AAABBB14042018 Ash81272722mddnd Jay81727272msnsms
运行命令后会生成两个文件:
file-12042018,内容为Jon238444kdhsljdjd7 Math37378338kdjdkskefile-14042018,内容为Ash81272722mddnd Jay81727272msnsms
完全匹配你的期望!如果后续遇到同一日期跨多行的内容,这个代码也能正确把所有内容合并到对应文件里。
内容的提问来源于stack exchange,提问作者Tauan Faria
相关产品推荐
相关产品推荐

