拆分平面文件并在 Linux 中添加分隔符
Split flat file and add delimiter in Linux
我想知道如何改进我已有的代码。
我的 shell 脚本读取一个平面文件,并根据每行的第一个字符 header 和详细信息将其拆分为两个文件。对于 header,第一个字符是 1,对于详细信息,是 2。拆分文件不包括第一个字符。
Header是用“|”分隔的,详细是fixed-width,所以,我把分隔符加进去alter.
我想要的是在一个 awk 中执行此操作,以避免创建 tmp 文件。
我使用 awk 命令分割文件,使用另一个 awk 命令添加定界符。
这是我现在拥有的:
Input=Input.txt
Header=Header.txt
DetailTmp=DetailTmp.txt
Detail=Detail.txt
#First I split in two files and remove first char
awk -v vFileHeader="$Header" -v vFileDetail="$DetailTmp" '/^1/ {f=vFileHeader} /^2/ {f=vFileDetail} {sub(/^./,""); print > f}' $Input
#Then, I add the delimiter to detail
awk '{OFS="|"};{print substr(,1,10),substr(,11,5),substr(,16,2),substr(,18,14),substr(,32,4),substr(,36,18),substr(,54,1)}' $DetailTmp > $Detail
有什么建议吗?
Input.txt 文件
120190301|0170117174|FRANK|DURAND|USA
2017011717400052082911070900000000000000000000091430200
120190301|0170117204|ERICK|SMITH|USA
2017011720400052082911070900000000000000000000056311910
Header.txt分裂
20190301|0170117174|FRANK|DURAND|USA
20190301|0170117204|ERICK|SMITH|USA
DetailTmp.txt分裂
017011717400052082911070900000000000000000000091430200
017011720400052082911070900000000000000000000056311910
017011727100052052911070900000000000000000000008250000
017011718200052082911070900000000000000000000008102500
017011726300052052911070900000000000000000000008250000
Detail.txt 需要
0170117174|00052|08|29110709000000|0000|000000000009143020|0
0170117204|00052|08|29110709000000|0000|000000000005631191|0
0170117271|00052|05|29110709000000|0000|000000000000825000|0
0170117182|00052|08|29110709000000|0000|000000000000810250|0
0170117263|00052|05|29110709000000|0000|000000000000825000|0
只需组合脚本
$ awk -v OFS='|' '/^1/{print substr([=10=],2) > "header"}
/^2/{print substr([=10=],2,10),substr([=10=],11,5),... > "detail"}' file
但是,您可能会更好,在第二遍的详细信息文件上使用 FIELDWIDTHS
。
我想知道如何改进我已有的代码。
我的 shell 脚本读取一个平面文件,并根据每行的第一个字符 header 和详细信息将其拆分为两个文件。对于 header,第一个字符是 1,对于详细信息,是 2。拆分文件不包括第一个字符。
Header是用“|”分隔的,详细是fixed-width,所以,我把分隔符加进去alter.
我想要的是在一个 awk 中执行此操作,以避免创建 tmp 文件。
我使用 awk 命令分割文件,使用另一个 awk 命令添加定界符。
这是我现在拥有的:
Input=Input.txt
Header=Header.txt
DetailTmp=DetailTmp.txt
Detail=Detail.txt
#First I split in two files and remove first char
awk -v vFileHeader="$Header" -v vFileDetail="$DetailTmp" '/^1/ {f=vFileHeader} /^2/ {f=vFileDetail} {sub(/^./,""); print > f}' $Input
#Then, I add the delimiter to detail
awk '{OFS="|"};{print substr(,1,10),substr(,11,5),substr(,16,2),substr(,18,14),substr(,32,4),substr(,36,18),substr(,54,1)}' $DetailTmp > $Detail
有什么建议吗?
Input.txt 文件
120190301|0170117174|FRANK|DURAND|USA
2017011717400052082911070900000000000000000000091430200
120190301|0170117204|ERICK|SMITH|USA
2017011720400052082911070900000000000000000000056311910
Header.txt分裂
20190301|0170117174|FRANK|DURAND|USA
20190301|0170117204|ERICK|SMITH|USA
DetailTmp.txt分裂
017011717400052082911070900000000000000000000091430200
017011720400052082911070900000000000000000000056311910
017011727100052052911070900000000000000000000008250000
017011718200052082911070900000000000000000000008102500
017011726300052052911070900000000000000000000008250000
Detail.txt 需要
0170117174|00052|08|29110709000000|0000|000000000009143020|0
0170117204|00052|08|29110709000000|0000|000000000005631191|0
0170117271|00052|05|29110709000000|0000|000000000000825000|0
0170117182|00052|08|29110709000000|0000|000000000000810250|0
0170117263|00052|05|29110709000000|0000|000000000000825000|0
只需组合脚本
$ awk -v OFS='|' '/^1/{print substr([=10=],2) > "header"}
/^2/{print substr([=10=],2,10),substr([=10=],11,5),... > "detail"}' file
但是,您可能会更好,在第二遍的详细信息文件上使用 FIELDWIDTHS
。