Awk 和 Grep 从 CLI 获取数据

Awk 和 Grep 从 CLI 获取数据

我想要获得如下输出:

Number      Name         Value
*************************************
889900     Staff         256000
990088     Staff         1048576

我的输入如下:

%%LST:="889900";%%


Actual                            Service                           Key                              Value 
Staff                             00000001                          350                               256000        
company                           00000002                          360                               1572864       

Total count = 2

There is together 1 report


%%LST:="990088";%%


Actual                            Service                           Key                               Value 
Staff                             00000003                          350                               1048576       
plusmines                         00000004                          120                               20480         
different                         1001                              201                               5120          

Total count = 3

There is together 1 report


%%LST:="112233";%%


Actual                            Service                           Key                               Value 
additional                        00000005                          320                               1048576       
payitoff                          20001                             73710                             1048576       
clubonetwothree                   00000006                          90006280                          1048576       

Total count = 3

There is together 1 report

我已经完成了以下编码:

IFS=$'\n'
cat > initial
cat initial | grep "%%LST:=" | awk -F'"' '{print$2}' > x1
cat initial | awk -F' ' '{if ($3 == 350) print $1,$4; else echo "0"}' > x2
rm results2
echo -e "Number       Name                      Value\n*************************************" >> results2
paste x1      x2 | sort -n | expand -t 13 >> results2
cat results2; 
rm initial

"Number"我想要的是从输入中获取"%%LST:=",并且名称来自 if "Key"is equals=350并且"Value"是输出中的相应值"Key"

目前,我的编码只是获取所有"Number"并将其粘贴到列表中,以及抓取的"Key"和信息"Value"

问题是,如果我的记录没有,"Key" = 350它不会跳过或留下空白空间。我的整个最终结果出了问题。

我可以使用什么功能来仅列出具有的相关信息"Key = 350"

答案1

#! /usr/bin/awk -f

BEGIN {
    OFS="\t";
    print "Number","Name","Value";
    print "*************************************";
    number="" ; name="" ; value="";
};

/^%%LST/ {
    if (number != "" && name != "" && value != "") { 
        print number, name, value;
        name=""; value="";
    } ;
    number=gensub(/%%LST:=?"([0-9]+)";%%/,"\\1","g") 
} ;

$3 == 350 { 
   name=$1;
   value=$4
};

END {
    if (name != "") {
        print number, name, value
    }
}

将其另存为,例如,remy.awk使其可执行chmod +x remy.awk,并为其提供标准输入或文件名上的数据(例如./remy.awk remy.txt

BEGIN {}部分将输出字段分隔符 (OFS) 设置为选项卡,然后打印输出标头,并初始化numbernamevalue变量。

然后它从以 '%%LST' 开头的行中提取数字(放入名为 的变量中number),但首先检查是否number非空 - 如果它已经有一个值,则它打印出上一条记录的详细信息,并清除namevalue变量。

在键(字段 3)等于 350 的行上,它从该行中提取name和。value

最后,如果非空,该END {}块将打印变量,以便如果最终记录(由 %%LST 行分隔)是 Key==350 的记录,则它可以正常工作。name如果没有这个,它将无法打印最终记录中的数据。

根据上面的示例数据,输出为:

$ ./remy.awk remy.txt 
Number  Name    Value
*************************************
889900  Staff   256000
990088  Staff   1048576

相关内容