【问题标题】:Split flat file and add delimiter in Linux在 Linux 中拆分平面文件并添加分隔符
【发布时间】:2019-12-16 11:07:23
【问题描述】:

我想如何改进我拥有的代码。

我的 shell 脚本读取一个平面文件,并根据每行的第一个字符、标题和详细信息将其拆分为两个文件。对于标题,第一个字符是 1,对于细节是 2。拆分的文件不包括第一个字符。

header 用“|”分隔,detail 是固定宽度的,所以我把分隔符添加到它的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,1,10),substr($1,11,5),substr($1,16,2),substr($1,18,14),substr($1,32,4),substr($1,36,18),substr($1,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

【问题讨论】:

    标签: linux shell awk split delimiter


    【解决方案1】:

    只需组合脚本

    $ awk -v OFS='|' '/^1/{print substr($0,2) > "header"} 
                      /^2/{print substr($0,2,10),substr($0,11,5),... > "detail"}' file
    

    然而,你可能会更好,在第二遍的细节文件上使用FIELDWIDTHS

    【讨论】:

    • 谢谢!有用。你能解释一下并展示一个使用 FIELDWITHS 的例子吗?
    猜你喜欢
    • 2022-11-29
    • 2011-09-06
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 1970-01-01
    • 2018-08-20
    • 1970-01-01
    相关资源
    最近更新 更多