首页 > 解决方案 > awk 从列 $3 创建多个包含模式和名称的文件

问题描述

你好,我想根据上一个问题扩展想法,对于生成的文件和包含模式“START”的文件,每个文件都包含当前日期的 $3 列的名称

输入文件1

START
A B 25276 FX M.1 20200421
A B 25276 FX M.1 20200328
A B 25276 FX M.1 20200328
A B 25276 FX M.1 20200328
A B 25276 FX M.1 20200328
A B 25276 FX M.1 20200328
A B 25276 FX M.1 20200423
A B 25276 FX M.1 20200423
A B 25276 FX M.1 20200423
A B 25276 FX M.1 20200423
A B 25276 FX M.1 20200423
A B 25276 FX M.1 20200423
END
START
A B 25060 FX M.1 20200421
END
START
A B 25172 FX M.1 20200421
END
START
A B 25320 FX M.1 20200429
A B 25320 FX M.1 20200421
A B 25320 FX M.1 20200429
A B 25320 FX M.1 20200423
END
START
A B 25173 FX M.1 20200427
A B 25173 FX M.1 20200504
A B 25173 FX M.1 20200429
END

输出将是这个多个文件,例如。

    x_name_25276_20200517
    x_name_25060_20200517
...

..

例如,生成的文件将包含:

猫 x_name_25276_20200517

START
A B 25276 FX M.1 20200421
A B 25276 FX M.1 20200328
A B 25276 FX M.1 20200328
A B 25276 FX M.1 20200328
A B 25276 FX M.1 20200328
A B 25276 FX M.1 20200328
A B 25276 FX M.1 20200423
A B 25276 FX M.1 20200423
A B 25276 FX M.1 20200423
A B 25276 FX M.1 20200423
A B 25276 FX M.1 20200423
A B 25276 FX M.1 20200423
END

没有找到太多示例如何仅通过以下部分实现此目的

awk '/^START/{if (f) close(f); f = "file" ++i} {print > f}'

标签: awk

解决方案


$ awk -v date="$(date +%Y%m%d)" '
       s && NF>2 {s=""; f=FILENAME "_" $3 "_" date; print s0 > f} 
       f         {print > f} 
       /^END/    {close(f); s=f=""}  
       /^START/  {s=1; s0=$0}' file

推荐阅读