Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 将文件归档到表awk中_Shell_Awk_Tags - Fatal编程技术网

Shell 将文件归档到表awk中

Shell 将文件归档到表awk中,shell,awk,tags,Shell,Awk,Tags,我正试图通过读取文件来制作表格 下面是我试图编译的代码示例: FHEAD|1|PRMPC|20200216020532|1037|S TMBPE|2|MOD TPDTL|3|72810|1995019|11049-|11049-|Dcto 20|0|5226468|20200216000001|20200222235959|2||1|||| TPGRP|4|5403307 TGLIST|5|5031472|1||| TLITM|6|1010

我正试图通过读取文件来制作表格

下面是我试图编译的代码示例:

FHEAD|1|PRMPC|20200216020532|1037|S
TMBPE|2|MOD
    TPDTL|3|72810|1995019|11049-|11049-|Dcto 20|0|5226468|20200216000001|20200222235959|2||1||||
        TPGRP|4|5403307
        TGLIST|5|5031472|1|||
        TLITM|6|101055590
            TPDSC|7|0|||-20||2|1|
        TPGRP|8|5403308
        TGLIST|9|5031473|0|||
    TPDTL|13|10728|1995021|11049-|11049-|Dcto 30|0|5226469|20200216000001|20200222235959|2||1||||
        TPGRP|14|5403310
        TGLIST|15|5031475|1|||
            TLITM|16|210000041
            TLITM|17|101004522
                TPDSC|113|0|||-30||2|1|
        TPGRP|114|5403309
        TGLIST|115|5031474|0|||
            TLITM|116|101047933
            TLITM|117|101004681
            TLITM|118|101028161
                TPDSC|119|0|||-25||2|1|
TPISR|214|101004225|2350|EA|20200216000000|COP|
TTAIL|1135
FTAIL|1136|1134
我试图开发代码,但它在一行中返回所有标记

for filename in "$input"*.dat; 
    do
    echo "$filename">>"$files"
    a=`awk -F'|' '$1=="FHEAD" && $5!=""{print $5}' "$filename"`
    b=`awk -F'|' '$1=="TPDTL" && $3!=""{print $3}' "$filename"`
    c=`awk -F'|' '$1=="TPDTL" && $4!=""{print $4}' "$filename"`
    d=`awk -F'|' '$1=="TPDTL" && $10!=""{print $10}' "$filename"`
    e=`awk -F'|' '$1=="TPDTL" && $11!=""{print $11}' "$filename"`
    f=`awk -F'|' '$1=="TPDSC" && $6!=""{print $6}' "$filename"`
    g=`awk -F'|' '$1=="TLITM" && $3!=""{print $3}' "$filename"`
例如:

echo -e ${d}
202002160000001 202002160000001

我想要一个像这样的东西

有人能帮我吗

提前感谢

假设:

  • 关键字出现的频率,如
    FHEAD
    TPDTL
    等 它们并不统一。如果需要,请使用最新版本
  • 行数应等于
    TLITM
    的计数
  • 当出现
    TPDSC
    时,应更新该表
那么,请您尝试以下方法:

awk 'BEGIN {FS = "|"; OFS = ","}
    $1 ~ /FHEAD/ {a = $5}
    $1 ~ /TPDTL/ {b = $3; c = $4; d = $10; e = $11}
    $1 ~ /TLITM/ {f[++tlitm_count] = $3}
    $1 ~ /TPDSC/ {g = $6;
        for (i=1; i<=tlitm_count; i++) {
            print a, b, c, d, e, f[i], g
        }
        tlitm_count = 0;
    }
' *.dat

如果希望输出分隔符为空白,请修改OFS的

请在问题中添加文本形式的预期输出示例,以使其更清晰。解决方案非常完美!非常感谢。但是,打印每行是否有任何字符限制?当他试图在输出中打印“g”时,会给出一个输入。@RCLFA感谢您的反馈。我想每行没有#个字符的限制。请你提供一个最小的样本输入集,附加到你的原始文章或通过下载网站,这样我就可以重现这种现象?BR.分析文件时,我注意到它们包含在字段g“\n”中。我明白了,这就是为什么我要写一条新的线路。感谢您的及时分析。
1037,72810,1995019,20200216000001,20200222235959,101055590,-20
1037,10728,1995021,20200216000001,20200222235959,210000041,-30
1037,10728,1995021,20200216000001,20200222235959,101004522,-30
1037,10728,1995021,20200216000001,20200222235959,101047933,-25
1037,10728,1995021,20200216000001,20200222235959,101004681,-25
1037,10728,1995021,20200216000001,20200222235959,101028161,-25