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)をタブに設定し、出力ヘッダーを印刷して変数を初期number化します。namevalue

次に、 '%%LST'で始まる行から数字を抽出し(という変数に入れてnumber)、最初にnumber空でないことを確認します。すでに値がある場合は、以前の詳細を印刷します。nameと変数を記録して消去しますvalue

キー(フィールド3)が350の行からその行の合計を抽出しますnamevalue

最後に、ブロックは空でない場合はEND {}変数を印刷し、最終レコード(%%LST行で区切られた)がKey = = 350のレコードである場合は正しく機能します。nameこれがないと、最終レコードのデータを印刷できません。

上記のサンプルデータに基づいて、出力は次のようになります。

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

おすすめ記事